perm filename LISP.NEW[MAC,LSP] blob
sn#269763 filedate 1977-03-24 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00020 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00004 00002 THURSDAY MARCH 03,1977 FQ+6D.12H.27M.23S. LISP 1258 - GLS -
C00017 00003 THURSDAY JAN 06,1977 FM+1D.23H.52M.11S. LISP 1252 - GLS -
C00029 00004 WEDNESDAY DEC 29,1976 FQ+1D.9H.29M.54S. LISP 1251 -JONL-
C00035 00005 TUESDAY SEPT 14,1976 FM+6D.1H.33M.7S. LISP 1211 -GLS,JONL-
C00052 00006 THURSDAY JULY 01,1976 NM+4D.11H.48M.23S. LISP 1168 - GLS -
C00062 00007 TUESDAY JUNE 15,1976 FM+3D.2H.27M.33S. LISP 1160 - GLS -
C00096 00008 MONDAY, MARCH 22,1976 FM+6D.22H.2M.17S. LISP 1130 - GLS & JONL -
C00135 00009 WEDNESDAY JUNE 11,1975 NM+2D.17H.37M.36S. LISP 1076 - GLS -
C00142 00010 TUESDAY MAY 27,1975 FM+2D.18H.3M.18S. NEWIO 1061 - GLS -
C00159 00011 FRIDAY APRIL 18,1975 FQ+9H.34M.47S. LISP 1049 - GLS -
C00210 00012 2/7/75 - JONL AND GLS -
C00232 00013 12/8/74 JONL & GLS
C00236 00014 FRIDAY SEPT 13,1974 LQ+4D.19H.41M.28S. LISP 909 - GLS -
C00241 00015 AUG 17, 1974 LISP 893 - GLS AND JONL -
C00249 00016 MONDAY JULY 29,1974 FQ+3D.1H.24M.28S. LISP 873 - GLS -
C00252 00017 FRIDAY JULY 19,1974 NM+8H.29M.40S. LISP 861 - GLS -
C00274 00018 5/22/74 JONL
C00293 00019 TUESDAY APRIL 23,1974 NM+2D.8H.36M.6S. LISP 810 - GLS -
C00320 00020 FRIDAY MARCH 01,1974 FQ+18H.38M.31S. LISP 767 - GLS -
C00332 ENDMK
C⊗;
THURSDAY MARCH 03,1977 FQ+6D.12H.27M.23S. LISP 1258 - GLS -
WELL, WE ARE WORKING AWAY ON THE NEW LISP MANUAL!
ELLEN IS DOING MOST OF THE WORK, WITH OTHERS PITCHING
IN WRITING NEW TEXT (THE CONFLICTS BETWEEN WHICH ELLEN
GETS TO RESOLVE). CURRENTLY CHAPTERS 3 AND 4 ARE IN
PROGRESS.
THE FILES ".INFO.;OLDIO ORDER" AND ".INFO.;NEWIO ORDER"
CONTAIN A SUMMARY OF THE FUNCTIONS AND VARIABLES AVAILABLE
IN LISP. I WILL TRY TO KEEP THESE UP-TO-DATE (THEY ARE
MECHANICALLY GENERATED).
THE FOLLOWING NAMING SCHEME TAKES EFFECT ON ITS AS OF THIS VERSION.
-> MEANS "IS LINKED TO" (DISK-TYPE FILE NAME LINKS).
L -> LISP -> NEWIO
Q -> NEWIO -> SYS:PURQIO >
O -> OLDIO -> SYS:PURBIB >
OL -> OLISP -> ONEWIO
OQ -> ONEWIO -> SYS:PURQIO NNN (FOR SOME NNN)
OO -> OOLDIO -> SYS:PURBIB NNN (FOR SOME NNN)
OOL -> OOLISP -> OONEWIO
OOQ -> OONEWIO -> SYS:PURQIO <
OOO -> OOOLDIO -> SYS:PURBIB <
THAT IS, L↑K AND LISP↑K NOW ALWAYS GET YOU A NEWIO.
SO DO Q↑K AND NEWIO↑K. TO GET AN OLDIO, USE O↑K OR OLDIO↑K.
THE "O" AND "OO" VERSIONS GET OLD AND VERY OLD VERSIONS.
THIS WAS ALREADY IN EFFECT ON AI, BUT IS NOW ON ALL ITS
MACHINES.
MANY BUGS HAVE BEEN FIXED IN THIS VERSION, INCLUDING
THE ONE ABOUT GC-OVERFLOW (I HOPE!). MANY NEW FEATURES
AS FOLLOWS. AS ALWAYS, NUMBERED ITEMS ARE FOR ALL LISPS,
AND LETTERED ITEMS FOR NEWIO ONLY.
[1] NEW FUNCTION: QUIT (COMPATIBLE WITH MULTICS VERSION)
[2] CHANGES TO GC-RELATED USER INTERRUPTS:
[2A] GC-OVERFLOW WORKS BETTER - CAN GET SEVERAL PER GC
[2B] GC-DAEMON GETS MORE INFORMATION NOWADAYS
[3] CHANGES TO STATUS FUNCTIONS:
[3A] (STATUS PURSPCNAMES) YIELDS NAMES OF ALL PURE SPACES
[3B] (STATUS HACTRN) YIELDS T FOR UNKNOWN SUPERIOR
[3C] (STATUS XJNAME) HAS BEEN RENAMED (STATUS SUBSYSTEM)
[3D] (STATUS XUNAME) HAS BEEN RENAMED (STATUS USERID)
[3E] (STATUS FEATURE TOPS-10) IS BEST WAY TO CHECK FOR TOPS-10
[3F] WE ARE PHASING OUT (STATUS TERPRI) - USE TERPRI VARIABLE
[A] FILEPOS WORKS ON OUTPUT FILES - ALL ITS I/O USES SIOT NOW
[B] INCLUDE PROVIDES AN EOFFN TO MAKE EOF TRANSPARENT
[C] AUTOLOAD NOW USES LOAD INSTEAD OF FASLOAD (LIKE MULTICS)
[D] DELETEF OF AN OPEN FILE NOW USES DELEWO (IT USED TO JUST LOSE)
[E] THE RENAME FUNCTION HAS BEEN RENAMED TO RENAMEF
[F] (STATUS TTYREAD) IS NOW IN THE READTABLE AGAIN IN NEWIO
[G] NUMERIC (STATUS TTYINT) VALUES CAN NOW FILTER ALL SUPRA-ASCII BITS
----------------------------------------------------------------
[1] (QUIT), AS ON MULTICS, CAUSES THE LISP JOB TO COMMIT SUICIDE.
(IT DOES NOT PRODUCE A ↑G OR ↑X QUIT - FOR THOSE, USE THE
↑G FUNCTION OR (ERROR 'QUIT)!)
QUIT IS ACTUALLY AN LSUBR OF 0 TO 1 ARGUMENTS. POSSIBLE
VALUES FOR THE ARGUMENT:
NIL SAME AS NO ARGUMENT - DO A NORMAL QUIT
T QUIT AS NOISELESSLY AS POSSIBLE (DON'T PRINT :KILL, ETC.)
ERROR ERROR QUIT. FLUSH TYPEAHEAD, AND GENERALLY CLEAN UP.
<N> A FIXNUM ARGUMENT IS MACHINE-DEPENDENT. ON ITS, IT IS
FED AS THE EFFECTIVE ADDRESS FOR .BREAK 16,.
[2] CHANGES TO GC-RELATED USER INTERRUPTS:
[2A] IT USED TO BE THAT IF SEVERAL SPACES GOT A GC-OVERFLOW
CONDITION DURING A SINGLE GC, ONLY ONE INTERRUPT WOULD
BE SIGNALED. NOW ALL OF THEM SHOULD BE SIGNALLED, AS
SEPARATE INTERRUPTS.
[2B] THE ARGUMENT RECEIVED BY GC-DAEMON HAS BEEN CHANGED
IN AN INCOMPATIBLE MANNER. THE OLD FORMAT WAS:
( (<SPACE> <FREE-BEFORE> . <FREE-AFTER>) ...)
THE NEW FORMAT IS:
( (<SPACE-NAME> <FREE-BEFORE> <FREE-AFTER>
<SIZE-BEFORE> <SIZE-AFTER>)
...)
THE TWO NEW QUANTITIES ARE THE SIZE OF THE SPACE AT
THE BEGINNING AND END OF THE GC. THE DIFFERENCE OF
THESE TWO QUANTITIES GIVES THE AMOUNT OF SPACE
ADDED DURING THE GC, WHILE THE DIFFERENCE BETWEEN
<SIZE-BEFORE> AND THE <SIZE-AFTER> FROM THE PREVIOUS
GC GIVES THE AMOUNT ADDED BETWEEN GC'S. NOTE ALSO
THAT THE NEW FORMAT DOESN'T HAVE THAT CRETINOUS
DOTTED PAIR, SO LATER MORE INFORMATION CAN BE ADDED
COMPATIBLY.
[3] CHANGES TO STATUS FUNCTIONS:
[3A] (STATUS PURSPCNAMES) YIELDS NAMES OF ALL PURE SPACES.
PRESENTLY THIS IS (LIST FIXNUM FLONUM BIGNUM),
BUT IN CASE THIS EVER CHANGES, THIS STATUS CALL IS
THE RIGHT WAY TO FIND THEM ALL. RECALL THAT
(STATUS SPCNAMES) GIVES THE NAMES OF NON-PURE SPACES.
[3B] (STATUS HACTRN) YIELDS T FOR UNKNOWN SUPERIOR.
AS BEFORE, IT CAN ALSO YIELD "DDT" FOR A DDT SUPERIOR,
"LISP" FOR A LISP SUPERIOR (THIS IS DETERMINED BY
BITS IN THE .OPTION USER VARIABLE), OR NIL FOR NO
SUPERIOR.
[3C] (STATUS XJNAME) HAS BEEN RENAMED (STATUS SUBSYSTEM).
EVENTUALLY THIS WILL BE MADE MEANINGFUL ON TOPS-10
AND MULTICS IMPLEMENTATIONS. THE INTENDED INTERPRETATION
IS "THE GENERIC NAME OF THIS PROGRAM".
(STATUS JNAME) IS TO BE INTERPRETED AS "THE UNIQUE
IDENTIFIER OF THIS JOB WITHIN THE TIME-SHARING SYSTEM".
[3D] (STATUS XUNAME) HAS BEEN RENAMED (STATUS USERID).
EVENTUALLY THIS WILL BE MADE MEANINGFUL ON TOPS-10
AND MULTICS IMPLEMENTATIONS. THE INTENDED INTERPRETATION
IS "THE GENERIC NAME OF THIS USER (E.G. "FRED").
(STATUS UNAME) IS TO BE INTERPRETED AS "THE UNIQUE
IDENTIFIER OF THIS LOGGED-IN INSTANCE OF THE USER
WITHIN THE TIME-SHARING SYSTEM".
[3E] (STATUS FEATURE TOPS-10) IS BEST WAY TO CHECK FOR
RUNNING UNDER A REAL TOPS-10 SYSTEM. WE MAY PHASE OUT
(STATUS FEATURE DEC10), OR LET IT MEAN ANY TOPS-10-LIKE
SYSTEM, SUCH AS SAIL. WE ALSO ANTICIPATE HAVING TO
INTRODUCE (STATUS FEATURE TOPS-20) SOMEDAY.
[3F] WE ARE PHASING OUT (STATUS TERPRI). PLEASE ELIMINATE
FROM YOUR PROGRAMS IF POSSIBLE. IN NEWIO YOU CAN SET
THE LINEL OF A FILE TO 0 INSTEAD, OR YOU CAN BIND
THE TERPRI VARIABLE.
[A] FILEPOS NOW WORKS ON OUTPUT FILES, THANKS TO IMPROVEMENTS
TO ITS. THIS ONLY WORKS IN ITS VERSION 1048 OR GREATER,
AND SO WILL NOT APPEAR ON A GIVEN MACHINE UNTIL A VERSION
OF ITS APPEARS WHICH CAN SUPPORT THE FEATURE.
AS A COROLLARY, ALL LISP BUFFERED I/O IS DONE WITH SIOT.
IN THIS WAY EXACT CHARACTER COUNTS ARE USED, ELIMINATING
THE TRAILING CONTROL-C PROBLEM.
[B] INCLUDE PROVIDES AN EOFFN TO MAKE EOF TRANSPARENT.
WHEN READING OFF THE END OF AN INCLUDED FILE, NO EOF
SHOULD BE DETECTED (UNLESS READ WAS IN THE MIDDLE OF AN
OBJECT, WHICH CAUSES A FAIL-ACT); READING SHOULD JUST
CONTINUE IN THE FILE POPPED OFF THE INSTACK. THIS MEANS
THAT AN INCLUDED FILE IS JUST LIKE STICKING THE INCLUDED
FILE IN THE MIDDLE OF THE INCLUDING I/O STREAM.
[C] AUTOLOAD NOW USES LOAD INSTEAD OF FASLOAD (LIKE MULTICS).
[D] DELETEF OF AN OPEN FILE NOW USES DELEWO (IT USED TO JUST LOSE).
THIS TOO DEPENDS ON ITS VERSION 1048 OR GREATER.
[E] THE RENAME FUNCTION HAS BEEN RENAMED TO RENAMEF.
THIS IS FOR COMPATIBILITY WITH DELETEF, MERGEF, PROBEF, ETC.,
AND TO AVOID USING UP A GOOD WORD.
[F] (STATUS TTYREAD) IS NOW IN THE READTABLE AGAIN IN NEWIO.
THIS IS COMPATIBLE WITH OLDIO, AND ALSO MAKES MORE SENSE
SINCE IT IS RELATED TO THE FORCE-FEED BITS WHICH ARE ALSO
IN THE READTABLE. SINCE IT NEVER WORKED BEFORE IN NEWIO
ANYWAY, THIS SHOULD NOT BREAK ANY PROGRAMS!
[G] RECALL THE FORMER OBSCURE FEATURE THAT IF AN "INTERRUPT
FUNCTION" FOR THE KEYBOARD SET VIA (SSTATUS TTYINT) IS A
FIXNUM, THEN IT SPECIFIES THE DEFAULT LISP ACTION FOR
AN INTERRUPT CHARACTER OF THAT ASCII VALUE; AND THAT FURTHERMORE
SUPRA-ASCII BITS COULD BE USED TO FILTER THE CONTROL AND
META BITS, NAMELY 400 REQUIRED THE META BIT TO BE PRESENT
FOR THE ACTION TO OCCUR, AND 400←22 FORBADE THE PRESENCE
OF THE META BIT, AND SIMILARLY FOR 200 AND THE CONTROL BIT.
THIS HAS BEEN EXTENDED TO THE TOP BIT (4000), THE SHIFT-LOCK
BIT (2000), AND THE SHIFT BIT (1000). IF YOU REALLY WANT
TO HACK AROUND WITH 12-BIT KEYBOARD INPUT, THIS IS YOUR
CUP OF T.
THURSDAY JAN 06,1977 FM+1D.23H.52M.11S. LISP 1252 - GLS -
WELL, FOLKS, JONL HAS GONE TO IBM FOR SEVERAL MOONS, AND I AM WORKING
ON MY THESIS THIS SEMESTER (DUE IN MAY), SO DON'T EXPECT TO GET
NEW FEATURES IMPLEMENTED WITH BLINDING SPEED. I WILL DO MY BEST TO
FIX ANY BUGS THAT CROP UP (IN PARTICULAR, I BELIEVE I HAVE FIXED
THE NEFARIOUS FASLOAD BUG OF VERSION 1251). MOST OF THE ITEMS
BELOW ARE NOT BRAND NEW, BUT JUST THINGS THAT DIDN'T WORK UNTIL NOW
OR WERE NEVER DOCUMENTED PROPERLY.
AS USUAL, NUMBERS=ALL LISPS, LETTERS=NEWIO ONLY.
[1] PRINC NOW NO LONGER AUTO-TERPRI'S BEFORE ATOMS.
[2] NEW "EVALSHUNT" HACK FOR PECULIAR FORMS.
[3] GC NOW MARKS HUNKS MORE SPACE-EFFICIENTLY.
[4] HOW TO DEFINE NEW EDITOR COMMANDS.
[A] NEW FUNCTION: +TYO
[B] SEEING GC STATISTICS IN THE WHO-LINE.
----------------------------------------------------------------
[1] PRINC NOW NO LONGER ATTEMPTS TO GET IN A TERPRI BEFORE AN
ATOM IF NECESSARY. (IT DOES, HOWEVER, PROVIDE A TERPRI ON
REACHING THE LINEL UNLESS OTHERWISE OVERRIDDEN BY THE VALUE OF
TERPRI OR BY (SSTATUS TERPRI ...).) PRIN1 CONTINUES TO PUT
IN AUTO-TERPRI'S BEFORE ATOMS.
[2] WHEN EVAL COMES UPON A FORM WHOSE CAR IS NON-ATOMIC AND
WHOSE CAAR IS NOT LAMBDA, FUNARG, OR LABEL, AND IF THE
VALUE OF THE ATOM EVAL IS NON-NIL, THEN THIS VALUE
SHOULD BE A FUNCTION OF ONE ARGUMENT, AND IT IS CALLED ON THE
FORM. IT IS THE RESPONSIBILITY OF THE FUNCTION TO EVALUATE THE
FORM AND DELIVER AN APPROPRIATE VALUE. THIS IS KNOWN AS THE
"EVALSHUNT" KLUDGE.
[3] GC NOW TAKES MUCH LESS PDL TO MARK HUNKS. IF YOU HAVE GOTTEN
PDL OVERFLOW DURING GC WHILE USING HUNKS, THIS SHOULD ALLEVIATE
YOUR PROBLEM.
[4] IF EDIT READS A COMMAND WHOSE NAME IS NOT RECOGNIZED, THEN IF THE
ATOM OF THAT NAME HAS AN EDIT PROPERTY, THEN THAT PROPERTY SHOULD
BE A FUNCTION. IT WILL BE CALLED WITH THE REPEAT COUNT AS AN ARGUMENT
(0 IS SUPPLIED IF NO ARGUMENT IS GIVEN). THE FUNCTION MAY
DO ANYTHING IT LIKES, BUT WILL PROBABLY WANT TO OPERATE ON THE
FUNCTION BEING EDITED. THE EDITOR'S CURSOR IS REPRESENTED BY
TWO DATA STRUCTURES, THE "LEFT-LIST" AND THE "UP-LIST".
THE FORMER SAYS HOW TO BACK UP AT THE CURRENT LEVEL OF LIST;
THE LATTER SAYS HOW TO BACK UP A LEVEL OF LIST STRUCTURE.
THE LEFT-LIST IS THE VALUE OF THE ATOM ≠≠≠ (THREE ALTMODES),
AND THE UP-LIST IS THE VALUE OF THE ATOM ↑↑↑ (THREE UPARROWS OR
CIRCUMFLEXES, ASCII 136).
THE CAR OF THE LEFT-LIST IS THE LEVEL OF LIST STRUCTURE BEING
EDITED; THE CURSOR IS CONSIDERED TO BE BEFORE THE CAAR
OF THE LEFT-LIST. THE CDR OF THE LEFT-LIST IS THE LEFT-LIST
FOR THE PREVIOUS POINT IN THIS LEVEL OF LIST. THE UP-LIST
IS A STACK OF OLD LEFT-LISTS.
THE FOLLOWING FUNCTIONS ARE USEFUL UTILITIES FOR BUILDING
NEW EDITOR FUNCTIONS, AND ILLUSTRATE THE CORRECT WAY TO MANIPULATE
THE LEFT-LIST AND UP-LIST.
(DEFUN RIGHT () (AND (EDCAR) (SETQ ≠≠≠ (CONS (CDAR ≠≠≠) ≠≠≠))))
(DEFUN LEFT () (AND ≠≠≠ (CDR ≠≠≠) (SETQ ≠≠≠ (CDR ≠≠≠))))
(DEFUN DOWN () (AND (EDCAAR)
(SETQ ↑↑↑ (CONS ≠≠≠ ↑↑↑) ≠≠≠ (NCONS (CAAR ≠≠≠)))))
(DEFUN UP () (AND ↑↑↑ (CAR ↑↑↑) (CDR ↑↑↑)
(SETQ ≠≠≠ (CAR ↑↑↑) ↑↑↑ (CDR ↑↑↑))))
(DEFUN YANK (FN)
((LAMBDA (PL)
(COND (PL (SETQ ↑↑↑ NIL)
(SETQ ≠≠≠ (NCONS PL)))
(T (PRINC '|??|))))
(GETL FN EDIT)))
(DEFUN SPLICE (IT)
(COND ((AND (LEFT) (EDCAR))
(RPLACD (CAR ≠≠≠) IT)
(RIGHT))
((AND (UP) (EDCAR))
(RPLACA (CAR ≠≠≠) IT)
(DOWN))))
(DEFUN KILL ()
(PROG2 NIL (CAAR ≠≠≠)
(SPLICE (COND ((EDCAR) (CDAR ≠≠≠)) (T (CAR ≠≠≠))))))
(DEFUN INSERT (IT)
(SPLICE (CONS IT (AND ≠≠≠ (CAR ≠≠≠))))
(RIGHT))
(DEFUN EDCAR () (AND ≠≠≠ (NOT (ATOM (CAR ≠≠≠)))))
(DEFUN EDCAAR () (AND (EDCAR) (NOT (ATOM (CAAR ≠≠≠)))))
NOTICE THAT LEFT AND RIGHT AND UP AND DOWN RETURN NIL
IF THEY FAIL. KILL RETURNS THE THING KILLED (THE STANDARD
EDITOR COMMAND "K" PUTS THIS THING INTO THE VALUE CELL OF "≠≠".)
AS TWO EXAMPLES OF NEW EDITOR COMMANDS, CONSIDER
"XCH" (NOTE THAT NAMES OF EDITOR COMMANDS MUST BE THREE CHARACTERS OR
FEWER), WHICH TRANSPOSES THE NEXT TWO ITEMS AFTER THE CURSOR,
AND "BRY", WHICH BURIES THE NEXT THING IN <ARGUMENT> LEVELS
OF LIST STRUCTURE.
(DEFPROP XCH ED-EXCHANGE EDIT)
(DEFUN ED-EXCHANGE (N) ;ARGUMENT IS IGNORED
(INSERT (PROG2 NIL (KILL) (RIGHT))))
(DEFPROP BRY ED-BURY EDIT)
(DEFUN ED-BURY (N)
(AND (EDCAR)
(DO ((I (MAX N 1) (- I 1)))
((ZEROP I))
(SPLICE (RPLACA (CAR ≠≠≠) (NCONS (CAAR ≠≠≠)))))))
I HAVE TESTED THESE DEFINITIONS AND THEY SEEM TO WORK.
[A] THE NEW FUNCTION +TYO OF TWO ARGUMENTS IS A SUPER-FAST TYO.
THE FIRST ARGUMENT IS THE ASCII VALUE TO OUTPUT AND THE
SECOND IS THE FILE TO OUTPUT IT ON. THE ATOM "T" MAY NOT
BE USED AS A SECOND ARGUMENT; INSTEAD OF (+TYO 43 T), SAY
(+TYO 43 TYO) OR THE EQUIVALENT. ALSO, THE SECOND ARGUMENT
MUST BE A SINGLE FILE, NOT A LIST OF FILES. THE +TYO FUNCTION
DOES NO ARGUMENT CHECKING IF NOT IN *RSET MODE.
IT DOES NOT ATTEMPT TO UPDATE THE CHARPOS OF THE FILE, OR
SUPPLY AN AUTO-TERPRI FOR EXCEEDING THE LINEL. IT DOES CHECK
FOR NON-IMAGE-MODE TTY FILES AND IN THAT CASE CONVERT ↑P AND ↑C
TO ↑P P AND ↑P Q. IT ALSO UPDATES THE FILEPOS CORRECTLY.
[B] NEWIO HAS HAD FOR SOME TIME STATUS CALLS FOR MANIPULATING THE
WHO-LINE; THESE WERE DESCRIBED PREVIOUSLY IN LISP ARCHIV.
NOW A NEW STATUS CALL CONTROLS THE DISPLAY OF GC STATISTICS IN
THE WHO-LINE.
(STATUS GCWHO) RETURNS THE CURRENT GCWHO STATUS AS A FIXNUM.
(SSTATUS GCWHO <N>) SETS THE STATUS TO THE FIXNUM <N>.
RIGHT NOW ONLY THE 1 AND 2 BITS OF THE STATUS ARE SIGNIFICANT.
1 MEANS THAT DURING A GC, THE WHO-LINE SHOULD BE ALTERED TO
READ "GC:XXXXX" WHERE XXXXX IS THE REASON FOR THE GC.
AT THE END OF THE GARBAGE COLLECTION THE WHO-LINE IS RESTORED.
2 MEANS THAT AT THE END OF THE GC THE .WHO2 WORD SHOULD
BE CLOBBERED WITH GC RUN TIME INFORMATION. SPECIFICALLY,
THE LEFT HALF GETS THE PERCENTAGE OF RUN TIME WHICH HAS BEEN
SPENT IN GC, AND THE RIGHT HALF GETS THE GC RUN TIME IN FORTIETHS
OF A SECOND. IF THE FIRST TWO ARGUMENTS TO (SSTATUS WHO1 ...)
ARE 52 OCTAL AND '%, THEN THESE STATISTICS WILL BE PRINTED
IN THE FORM "NNN% HH:MM:DD.T", JUST LIKE THE STANDARD SYSTEM
RUNTIME PERCENTAGE AND VALUE. IN THIS WAY ONE CAN CONTINUOUSLY
MONITOR GC RUN TIME STATISTICS. THE 1 AND 2 BITS MAY BE USED
TOGETHER (3) OR INDEPENDENTLY. NOTE THAT WHILE USING THE 2 BIT
THE .WHO3 VARIABLE IS STILL LEFT OVER FOR USE BY THE USER.
THUS ONE MIGHT SAY:
(SSTATUS WHO1 52 '% 166 0)
(SSTATUS GCWHO 3)
(SSTATUS WHO3 'QUUX)
AND ONE WOULD NORMALLY SEE "43% 00:15:07.8 QUUX", BUT DURING
A GC ONE WOULD SEE "GC:FIXNUM" OR WHATEVER.
A NOTE FOR THOSE WHO USE SUSPEND: IF THE SUSPENDED JOB IS DUMPED
OUT AND LATER RELOADED, THE RUNTIME (MAINTAINED BY THE TIME-SHARING
SYSTEM) WILL HAVE BEEN RESET, BUT NOT THE GCTIME, WHICH IS MAINTAINED
BY LISP. THEREFORE A ROUTINE WHICH DOES A SUSPEND SHOULD PERFORM
(SSTATUS GCTIME 0) ON RETURN FROM THE SUSPEND IN ORDER TO MAKE
THE WHO-LINE AND OTHER GC STATISTICS ACCURATE.
WEDNESDAY DEC 29,1976 FQ+1D.9H.29M.54S. LISP 1251 -JONL-
AS USUAL, NUMBERED ITEMS APPLY BOTH TO OLDIO AND NEWIO LISPS;
LETTERED ITEMS APPLY ONLY TO NEWIO.
1) THE FUNCTION "RANDOM" HAS BEEN SLIGHTLY IMPROVED
2) NUMBERS GIVEN AS FILE-NAME ARGUMENTS ARE NOW CONVERTED TO
SYMBOLIC STRINGS ACCORDING TO A RIGID ALGORITHM.
3) ALLOC NO LONGER ASKS FOR "CORE?".
4) ALL VERSIONS ARE NOW BIBOP. TOPS-10 VERSION IS FULLY BIBOPIFIED.
5) MACDMP HAS BEEN FLUSHED. USE SUSPEND.
6) THE VALUE OF THE ATOM "TERPRI" NOW CONTROLS THE AUTOMATIC
INSERTION OF NEWLINE CHARACTERS IN THE CHARACTER OUTPUT STREAMS.
7) MORE THINGS OPEN-CODED BY NCOMPLR, AND OTHER UPDATES
8) EDIT ALLOWS THE USER TO DEFINE NEW EDITING FUNCTIONS:
[A] HOW TO USE DEFAULT LINEL AND PAGEL FOR FILES.
[B] NCOMPLR THINKS IT KNOWS ABOUT INCLUDE NOW
[C] WHO-LINES ON AI TV-TERMINALS ARE NOW USABLE.
----------------------------------------------------------------
1) "RANDOM" CHANGED SLIGHTLY. NEW ALGORITHM FROM KNUTH IS MUCH
BETTER - NO LONGER HAS THE CORRELATED-TRIPLES PROPERTY.
(RANDOM NIL) AS WELL AS ANY TWO-ARGUMENT CALL TO RANDOM RESTARTS
THE GENERATOR OVER AT ITS BEGINNING. TIMING IS THE SAME.
2) FIXNUMS GIVEN AS FILE NAMES: PREVIOUSLY, THESE WERE CONVERTED
TO CHARACTER STRINGS MERELY BY PRINTING IN THE CURRENT BASE.
NOW, THE BASE IS TEMPORARILY LAMBDA-BOUND TO TEN, AND *NOPOINT
TO NIL, DURING THE CONVERSION. FOR EXAMPLE, IF BASE=IBASE=8,
THEN TYPING IN AND EVALING THE FORM
(UREAD TEST 131 DSK LOSER)
WILL RESULT IN SELECTING THE FILE DSK:LOSER;TEST 89
3) ALLOC NO LONGER ASKS FOR "CORE". A # WILL PROMP THE ENTRIES THAT
CANNOT BE EXPANDED AFTER ALLOCATION. FOR ITS VERSIONS ONLY THE
PDLS CANNOT BE EXPANDED, BUT IN THE TOPS-10 VERSION,
BINARY-PROGRAM-SPACE MAY NOT BE FURTHER EXPANDED.
4) AND 5) HOORAY, HOORAY!
6) THE VALUE OF THE ATOM "TERPRI" NOW CONTROLS THE AUTOMATIC
INSERTION OF NEWLINE CHARACTERS IN THE CHARACTER OUTPUT STREAMS.
IF NON-NIL, THEN ALL SUCH AUTOMATIC INSERTION IS SUPPRESSED FOR
ALL OUTPUT FILES AND DEVICES, REGARDLESS OF THEIR PARTICULAR
LINELS. IN NEWIO, IF THE LINEL FOR A PARTICULAR OUTPUT FILE IS 0,
THEN THE AUTOMATIC INSERTION IS SUPPRESSED FOR THAT FILE.
7) NCOMPLR NOW OPEN-CODES TYPEP, ATOM, NUMBERP, FIXP, FLOATP, BIGP,
ZEROP, MINUSP, PLUSP, AND HUNKP USING THE SEGMENT TABLE.
FOR TOPS-10 LUSERS: THE MAKLAP PARSER ACCEPTS PPN DESIGNATIONS
IN SQUARE BRACKETS.
FOR ITS LUSERS: @DEFINE HAS BEEN DEFINED. SEE DOCUMENTATION
FOR THE @ CROSS-REFERENCING PROGRAM.
THE VALUE OF THE ATOM "GCPROTECT" NOW CONTROLS HOW LAP AND FASLOAD
USE THAT FUNCTION. THIS IS A SPECIAL HAC FOR OWL SYSTEM, AND
NO ONE ELSE SHOULD EVER SET "GCPROTECT" TO NON-NIL.
8) EDIT ALLOWS THE USER TO DEFINE NEW EDITING FUNCTIONS. PUTTING AN
"EDIT" PROPERTY ON AN ATOM MAKES IT AN EDITOR COMMAND, AND WHEN
INVOKED, THAT FUNCTIONS IS CALLED WITH THREE ARGUMENTS:
I) REPEAT COUNT
II) THE CURRENT "LEFT-LIST" (VALUE OF THE ATOM ≠≠≠)
III) THE CURRENT "UP-LIST"
FOR MORE DETAILS, SEE THE FILE MC:LISP;EDITOR >
[A] WHENEVER A FILE-OBJECT IS CREATED, SUCH AS BY "OPEN", THE LINEL AND
PAGEL ARE SET FROM AN INTERNAL DEFAULT VALUE. THESE VALUES ARE
ACCESSED BY (LINEL NIL) (PAGEL NIL), AND SET TO NEW VALUES BY
(LINEL NIL <NEWVAL>) (PAGEL NIL <NEWVAL>)
[B] QCOMPLR THINKS IT KNOWS ABOUT INCLUDE. WHAT MORE CAN WE SAY?
[C] THERE ARE THREE WHO-LINES USABLE FROM LISP ON THE AI MACHINE,
AND THE GARBAGE-COLLECTOR CAN DISPLAY ITS OPERATIONS ON A WHO-LINE
QUUX WILL DOCUMENT THIS STUFF AS AND WHEN IT IS OPERATIONAL.
TUESDAY SEPT 14,1976 FM+6D.1H.33M.7S. LISP 1211 -GLS,JONL-
OLDIO AND NEWIO LISPS NOW BOTH ANNOUNCE THEMSELVES AS SUCH.
YOU CAN GET AN OLDIO BY TYPING OLDIO↑K OR O↑K; AS BEFORE,
NEWIO↑K OR Q↑K GETS A NEWIO. IN THE NEAR FUTURE, LISP↑K
AND L↑K WILL START PROVIDING A NEWIO INSTEAD OF AN OLDIO.
OLDIO WILL STILL BE AVAILABLE AS OLDIO↑K OR O↑K FOR SEVERAL
MONTHS AFTER THAT.
NUMBERED ITEMS BELOW APPLY TO ALL LISPS; LETTERED ONES TO NEWIO ONLY.
[1] WHAT ARE PEOPLE USING HUNKS FOR?
[2] NEW ARITHMETIC FUNCTION: IFIX
[3] "AUTOLOAD" HAS LOWER PRIORITY THAN OTHER FUNCTIONAL PROPERTIES
[4] ALLOC FUNCTION AND GC PRINTOUT SUPPRESS ZERO-SIZE SPACES
[5] EVALHOOK NOW HOOKS BOTH A MACRO CALL AND ITS EXPANSION
[6] NEW .FASL MACRO PRINTS SUPPRESSABLE LOAD MESSAGE
[7] CHANGES TO EDIT FUNCTION AND NEW COMMANDS
[A] NEWIO NOW PROVIDES A ##MORE## PROCESSOR
[B] NEW NVID, SLAVE, MPX PACKAGES FOR NEWIO
[C] PROBLEM WITH INIT FILES IN NEWIO: UREAD DOESN'T CLOSE THEM
[D] UNTRAPPED MEMORY AND MACHINE ERRORS NOW GO TO DDT
[E] CHANGES TO HANDLING OF TTY BLOCK OUTPUT
[F] BUG OF FASLOAD FROM WITHIN FASLOAD-FILE-NOT-FOUND BREAK FIXED
[G] STUPID SPACE-SWALLOWING THING ONLY HAPPENS IF READ IS NIL
[H] NEW CURSORPOS FEATURES: A, H, I, V
[I] THE ACTION AT END-OF-FILE HAS BEEN CHANGED
----------------------------------------------------------------
[1] IF YOU USE HUNKS, SEND SOME MAIL TO GLS SAYING FOR WHAT.
(JUST NOSY, I GUESS.) NCOMPLR NOW OPEN-CODES CXR.
[2] (IFIX X) IS JUST LIKE (FIX X), EXCEPT THAT X IS CONSTRAINED TO BE
WITHIN THE RANGE OF FIXNUMS. WHILE "FIX" MAY RETURN A BIGNUM,
"IFIX" WILL NOT, AND THIS ALLOWS EFFICIENT OPEN-CODING OF "IFIX".
CAVEAT EMPTOR! THIS IS NOT THE SAME FUNCTION AS FORTRAN'S "IFIX":
THIS ONE IS THE SAME AS THE "ENTIER" FUNCTION, AS IN ALGOL.
[3] WHENEVER LISP LOOKS UP A FUNCTION ON A PROPERTY LIST, IT
WILL NOW PREFER A SUBR, EXPR, ETC. TO AN AUTOLOAD PROPERTY
EVEN IF THE SUBR (OR WHATEVER) OCCURS AFTER THE AUTOLOAD
PROPERTY ON THE PROPERTY LIST. THAT IS, IT EFFECTIVELY
LOOKS FOR OTHER FUNCTIONAL PROPERTIES FIRST, AND ONLY ON
FAILURE DOES LISP CHECK FOR AN AUTOLOAD PROPERTY.
THIS FIXES THE SCREW WHERE ONE PACKAGE DEFINES THE SUBR
FOO AND THEN ANOTHER DOES (DEFPROP FOO ... AUTOLOAD).
[4] IF A SPACE HAS ZERO SIZE (OFTEN TRUE OF HUNK SPACES!),
THEN THE ALLOC FUNCTION WILL NOT INCLUDE THE SPACE IN
THE RETURNED DATA, AND GC STATISTICS PRINTOUT WILL NOT
MENTION THE SPACE. (STATUS SPCNAMES) WILL, HOWEVER,
MENTION ALL SPACES, EVEN THOSE OF ZERO SIZE.
[5] EVALHOOK NOW HOOKS BOTH A MACRO CALL AND ITS EXPANSION.
FORMERLY THE HOOK FUNCTION SAW THE MACRO CALL, AND THEN
THE FIRST FORM WITHIN THE EXPANSION, BUT NOT THE EXPANSION
ITSELF.
[6] MANY AUXILLIARY FILES, SUCH AS "GRIND", "LAP", "ALLFILES", ETC.
WHICH ARE AUTOLOADABLE, OR FASLOADED BY THE USER, PRINT A MESSAGE
ANNOUNCING THEIR VERSION NUMBER AND THE FACT THAT THEY ARE BEING
LOADED. FOR EXAMPLE, WHEN ALLFILES IS LOADED, IT PRINTS
;LOADING ALLFILES 43
BY CONVENTION, ALL SUCH LOADING MESSAGES ARE SUPPRESSED IF THE
USER HAS DONE (SSTATUS FEATURE NOLDMSG). ALL SUCH FILES WRITTEN
IN LISP HAVE EXPR CODE WHICH CHECKS THE FEATURE LIST FOR
"NOLDMSG", AND IF ABSENT, PRINTS THE LOADING MESSAGE.
TO FACILITATE SUCH A MESSAGE PRINTING FEATURE FOR PACKAGES WRITTEN
IN MIDAS, THE STANDARD FILE "SYS:.FASL DEFS", TO BE INSERTED BY
.FASL FILES, NOW HAS A MACRO "VERPRT". ITS ARGUMENT SHOULD BE
THE NAME OF THE PACKAGE; IT GENERATES A .SXEVAL FORM WHICH
WILL PRINT A MESSAGE WHEN THE FILE IS LOADED. FOR EXAMPLE,
THE ALLFILES PACKAGE EFFECTIVELY BEGINS:
TITLE ALLFILES
.FASL
.INSRT SYS:.FASL DEFS
VERPRT ALLFILES
THE GENERATED FORM WORKS IN EITHER OLDIO OR NEWIO;
IN NEWIO, THE MESSAGE IS PRINTED ON THE FILES SPECIFIED
BY THE VARIABLE "MSGFILES" (WHICH IS ALSO USED BY ALL LISP
SYSTEM MESSAGES).
[7] CHANGES TO THE "BINFORD EDITOR" (EDIT FUNCTION):
[7.1] THE COMMANDS "C" AND "-C" HAVE DISAPPEARED.
THEY WERE EQUIVALENT TO THE STILL-EXISTING
"F" AND "-F" COMMANDS.
[7.2] "SS" = "SAVE SPOT", "RS" = "RESTORE SPOT"
BOTH TAKE AN ATOMIC SYMBOL AS AN ARGUMENT.
SS SAVES THE CURRENT "SPOT" (WHERE THE $$ APPEARS)
AS THE VALUE OF THE SPECIFIED VARIABLE, AND RS
RETURNS TO THAT SPOT. THUS:
SS FOO
... LOTSA EDITING ...
RS FOO
<NOW CURSOR IS WHERE IT WAS BEFORE THE SS>
[7.3] AN ARGUMENT TO EDIT NO LONGER CONTROLS THE AUTO-PRINT
FEATURE (SEE [7.4] BELOW); INSTEAD, IT SHOULD BE AN
ATOMIC SYMBOL, THE NAME OF A FUNCTION. AS THE EDITOR
IS ENTERED, THAT FUNCTION IS "YANKED" SO THAT EDITING
MAY BEGIN ON ITS CODE WITHOUT EXPLICITLY USING THE
"Y" COMMAND. THE VALUE OF THE VARIABLE "EDIT"
CONTROLS WHICH PROPERTIES WILL BE HUNTED FOR BY THE
"Y" OPERATION [INITIAL VALUE IS (EXPR FEXPR MACRO)].
[7.4] "SP" = "START/STOP PRINTING" TOGGLES THE STATE OF
THE AUTOMATIC PRINTOUT AFTER EACH COMMAND.
[7.5] "-KI" IS LIKE "L KI"; THAT IS, IT REPLACES THE
PRECEDING S-EXPRESSION WITH ITS ARGUMENT.
[7.6] AN "S" COMMAND IMMEDIATELY FOLLOWED BY "$$"
(I.E. A NULL SEARCH STRING" WILL REPEAT THE PREVIOUS
SEARCH, AS IN TECO.
[7.7] YANKING IN A VALUE PROPERTY NOW WINS. THUS:
YP FOO VALUE $$
ALLOWS YOU TO EDIT THE VALUE PROPERTY OF FOO.
----------------------------------------------------------------
[A] NEWIO NOW PROVIDES A ##MORE## PROCESSOR, IF YOU ARE IN
":TCTYP MORE" MODE WHEN LISP STARTS UP. WHEN THE END OF
THE SCREEN IS REACHED, "##MORE##" IS PRINTED, AND LISP
WAITS FOR A CHARACTER. SPACE OR RUBOUT IS SWALLOWED,
AND ANYTHING ELSE IS LEFT TO BE SEEN BY LATER ##MORE##'S
(AND EVENTUALLY BY READ). THE STATE OF THE ##MORE## INTERRUPT
MAY STILL BE TOGGLED BY TYPING <CONTROL-UNDERSCORE>M AT LISP,
AS WITH ANY OTHER ITS JOB.
[B] THE VARIOUS MOBYIO FEATURES IMPLEMETED ONLY ON THE AI MACHINE
(SUCH AS REAL AND FAKE TV'S, 340 STUFF, PLOTLIST AND MULTIPLEXOR
ROUTINES) HAVE BEEN CODED AS AUTOLOAD PACKAGES FOR NEWIO. THEY
ARE VIRTUALLY UNTESTED, AND WE WOULD APPRECIATE IT IF TV AND 340
HACKERS WOULD GIVE THEM A TRY AND HELP FIND THE BUGS.
[C] .LISP. (INIT) FILES ARE NOT HANDLED VIA THE UREAD MECHANISM
IN NEWIO. A STANDARD TRICK IN OLDIO, NOT USABLE IN NEWIO, IS TO
CALL UREAD IN THE LAST FORM IN AN INIT FILE, AND DEPEND ON IT TO
CLOSE THE INIT FILE BEFORE OPENING THE NEW ONE. SINCE THIS
DOESN'T WORK IN NEWIO, IT MAY HAPPEN THAT AN .INIT. FILE IS NEVER
CLOSED. THERE ARE TWO SOLUTIONS:
(1) LET THE .INIT. FILE EXPLICITLY CLOSE ITSELF, AND POP THE
INPUT STACK, DURING THE EVALUATION OF THE LAST FORM. E.G.
(COMMENT CORE 120 . . .) ;RELIC FOR ALLOC
(DO SOME STUFF)
. . . ;MORE STUFF
(PROGN (CLOSE INFILE) (INPUSH -1))
(2) ARRANGE NOT TO RESET ↑Q TO NIL IN THE INIT FILE, SO THAT
THE TOP-LEVEL READ-EVAL-PRINT LOOP WILL ENCOUNTER
END-OF-FILE AND CLOSE IT FOR YOU.
[D] THE OLD MESSAGE ABOUT
;REFERENCE TO NON-EXISTENT MEMORY FROM LOCATION 314159
;PROGRAM TRAPPED WHILE IN COMPLETELY-CRETINOUS-ROUTINE
HAS BEEN FLUSHED IN NEWIO. NOW, WHEN A MEMORY PROTECT VIOLATION,
WRITE INTO READ-ONLY MEMORY, ILLEGAL OPERATION, OR PARITY ERROR
OCCURS, NEWIO CHECKS THE VALUE OF THE ATOM "MACHINE-ERROR",
AS PREVIOUSLY DOCUMENTED. IF NON-NIL, IT IS THE USER HANDLER
FOR THE ERROR. IF NIL, LISP REFLECTS THE INTERRUPT BACK OUT,
AND DDT HANDLES IT, PRINTING THE FAMILAR MESSAGE:
MPV; 314159>>MOVE 1,(2) 1/ 43 271828/ ??
WHICH MAY SEEM SOMEWHAT MORE CRYPTIC, BUT WILL MAKE IT MUCH EASIER
FOR KNOWLEDGEABLE LISP HACKERS TO DEBUG THE ERROR. TO GET THE
EFFECT OF THE OLD HANDLER (RETURN TO TOP LEVEL), TYPE $G TO DDT.
SYSTEMS SUCH AS MACSYMA WHICH REQUIRE A BETTER USER INTERFACE SHOULD
PROVIDE A MACHINE-ERROR USER INTERRUPT HANDLER.
[E] ALL TTY BLOCK OUTPUT IN NEWIO IS NOW DONE WITH SIOT.
AS A COROLLARY, A FILE WRITTEN IN TTY BLOCK IMAGE OUTPUT MODE
WILL WRITE 8-BIT CHARACTERS, AND TTY BLOCK FIXNUM OUTPUT
WILL WRITE 12.-BIT CHARACTERS. SUPER SYSTEMS HACKERS TAKE NOTE!
[F] BUG OF FASLOAD FROM WITHIN FASLOAD-FILE-NOT-FOUND BREAK FIXED.
WHEN YOU GET A FILE-NOT-FOUND ERROR FROM FASLOAD, IT NOW WORKS
TO REPEAT THE FASLOAD WITHOUT EXITING FROM THE BREAK.
[G] THE KLUDGE WHERE LISP'S TOP-LEVEL AND BREAK-LEVEL SWALLOW A
SPACE AFTER AN ATOM DOES NOT HAPPEN IF THE USER SUPPLIED A
READ FUNCTION BY SETQ'ING THE VARIABLE "READ".
[H] NEW CURSORPOS FEATURES: A, H, I, V
(CURSORPOS 'A) ADVANCES TO A FRESH LINE; THAT IS,
IT DOES A TERPRI UNLESS THE TTY IS ALREADY
AT THE BEGINNING OF A LINE.
(CURSORPOS 'P) (OUTPUT A ↑P) HAS BEEN FLUSHED.
(TYO 20) NOW DOES THE RIGHT THING IN NEWIO.
(CURSORPOS 'H <N>) SETS JUST THE HORIZONTAL POSITION
TO <N> WITHOUT AFFECTING THE VERTICAL POSITION.
(CURSORPOS 'V <N>) SIMILARLY SETS THE VERTICAL POSITION.
(CURSORPOS 'I <N>) OUTPUTS ASCII CODE <N> AS A ONE-POSITION
PRINTING CHARACTER (WILL NOT WORK UNTIL IMPLEMENTED
IN ITS, WHICH ISN'T YET!).
[I] THE ACTION AT END-OF-FILE, CONTRARY TO THE MOONUAL, IS NOW:
IF WITHIN READ IN THE MIDDLE OF AN OBJECT (TYI CANNOT BE
"IN THE MIDDLE OF AN OBJECT") SIGNAL A READ-EOF ERROR.
OTHERWISE, IF NO USER EOF HANDLER BELONGS TO THE FILE,
THEN CLOSE THE FILE UNLESS IT IS A TTY
(EOF ON A TTY MERELY MEANS OVER-RUBOUT),
POP THE INPUT STACK (BY DOING (INPUSH -1)),
THEN IF WITHIN A READ THAT HAD ARGUMENTS
RETURN THE EOF VALUE, AND OTHERWISE REPEAT
THE READ FROM THE NOW CURRENT FILE POPPED.
IF THERE WAS A USER EOF HANDLER,
THEN CALL IT WITH THE FILE AND EOF VALUE AS
ARGUMENTS. WHEN IT RETURNS, THEN
IF IT RETURNED NIL, CLOSE THE FILE (UNLESS
IT IS A TTY) AND POP THE INPUT STACK,
THEN REPEAT THE READ FROM THE NEW CURRENT
INPUT FILE.
IF IT RETURNED T, REPEAT THE READ USING WHATEVER
SOURCE THE EOF HANDLER MADE CURRENT.
IF IT RETURNED ANY OTHER VALUE, THEN
IF NOT WITHIN A READ WITH ARGUMENTS,
PRETEND IT RETURNED NIL.
OTHERWISE, EXIT THE READ WITH THE VALUE
RETURNED BY THE EOF HANDLER.
IN THE ABOVE, "READ" REFERS TO WHATEVER INPUT FUNCTION WAS
CALLED, SUCH AS READ, READLINE, TYI, ETC.
THURSDAY JULY 01,1976 NM+4D.11H.48M.23S. LISP 1168 - GLS -
[1] HUNK STUFF HAS CHANGED; HUNK,HUNKIFY => MAKHUNK,HUNK
[2] TOPLEVEL AND BREAKLEVEL FLUSH SPACES AFTER ATOMS
[3] PRINT IS MORE CLEVER ABOUT AUTO-TERPRI AND PRINLEVEL
[4] NEW FUNCTION "SUBR" FINDS ROUTINE A PC IS IN
FOR NEWIO ONLY:
[A] MAR-BREAK INTERRUPT TURNS OFF MAR
[B] ALL THE NEW INTERRUPTS RUN IN (NOINTERRUPT T) STATE
[C] THE VARIABLE DEFAULTF IS THE DEFAULT FILE NAMES
[D] MACHINE-ERROR INTERRUPT NOW GETS MORE ARGUMENTS
----------------------------------------------------------------
[1] THE HUNK STUFF HAS BEEN REVISED AS FOLLOWS:
(CXR 0 X) = (CDR X), (CXR 1 X) = (CAR X)
THIS IS THE REVERSE OF WHAT IT INITIALLY WAS. THE OTHER
COMPONENTS ARE STILL COMPONENTS 2 THROUGH N-1.
THE OLD "HUNKIFY" FUNCTION HAS BEEN RENAMED "HUNK".
IT TAKES ITS ARGUMENTS IN THE ORDER 1, 2, 3, ..., N-1, 0.
THIS IS THE ORDER THEY ARE PRINTED IN. THUS:
(SETQ FOO (HUNK 1 2 3 4 5))
(1 . 2 . 3 . 4 . 5)
(CXR 1 FOO)
1
(CXR 2 FOO)
2
(CXR 0 FOO)
5
THE OLD "HUNK" FUNCTION HAS BEEN RENAMED "MAKHUNK".
IT ALSO HAS AN EXTENDED DEFINITION: IF THE ARGUMENT TO
MAKHUNK IS A FIXNUM, IT CREATES A HUNK THAT BIG FILLED
WITH NILS. IF THE ARGUMENT IS A LIST, IT CREATES A HUNK
FILLED WITH THE ELEMENTS OF THE LIST. THUS
(MAKHUNK (LIST A B C D)) = (HUNK A B C D)
[2] IN THE SYSTEM-SUPPLIED TOPLEVEL AND BREAKLEVEL
READ-EVAL-PRINT LOOPS, JUST AFTER AN ITEM IS READ THE
FOLLOWING OCCURS:
(AND (ATOM THE-ITEM)
(NOT (ZEROP (BOOLE 1 100000
(STATUS SYNTAX (TYIPEEK)))))
(TYI))
IN THIS WAY THE SPACE THAT TERMINATED THE ATOM (IF IT WAS
IN FACT A SPACE) IS FLUSHED. THIS IS SO THAT THE SPACE
WILL NOT HANG AROUND AND CONFUSE, E.G., **MORE**
PROCESSING. USER TOPLEVELS AND BREAKLEVELS SHOULD DO
A SIMILAR THING.
I WOULD APPRECIATE GETTING COMMENTS ABOUT THIS GENERAL
PROBLEM ABOUT SPACES AFTER ATOMS. SHOULD THERE BE TWO
READ FUNCTIONS, ONE WHICH FLUSHES SPACES AND ONE WHICH
DOES NOT? OR WHAT? -- GLS
[3] A NEW USELESS FEATURE OF PRINT IS THAT THE AUTO-TERPRI
HACK IS MORE CLEVER. UP TO NOW PRINT HAS CALCULATED
THE SIZE OF EACH ATOMIC SYMBOL AND PUT A TERPRI (CARRIAGE
RETURN) BEFORE THE SYMBOL IF IT WON'T FIT ON THE CURRENT OUTPUT
LINE. NOW IT CALCULATES OR ESTIMATES THE LENGTH OF EACH ATOM
(NUMBERS, ETC., AS WELL AS SYMBOLS), AND ALLOWS FOR ANY
PARENTHESES WHICH MUST PRECEDE OR FOLLOW THE ATOM. THUS,
IF THE NEXT FRAGMENT TO PRINT IS "((FOOBAR)))", PRINT
WILL TERPRI IF THERE ARE NOT AT LEAST ELEVEN CHARACTERS
LEFT IN THE OUTPUT LINE. THIS MEANS THAT YOU DON'T GET
ISOLATED LEFT PARENS AT THE END OF A LINE, OR RIGHT PARENS
AT THE BEGINNING OF A LINE.
[4] THE NEW FUNCTION "SUBR" (ONLY IN BIBOP LISPS, FOR OBSCURE
TECHNICAL REASONS), TAKES ONE ARGUMENT, A FIXNUM, AND TRIES
TO DETERMINE WHAT FUNCTION THAT NUMBER WOULD BE A PC IN.
THIS HACK IS ONLY APPROXIMATE, AND DEPENDS ON LOOKING AT ALL
THE PROPERTY LISTS OF ATOMS IN THE CURRENT OBARRAY.
THE ATOM WITH THE CLOSEST REASONABLE SUBR, FSUBR, LSUBR,
OR ARRAY PROPERTY IS RETURNED AS THE RESULT.
IF NO REASONABLE RESULT IS FOUND, THE ATOM "?" IS RETURNED.
(WHAT THIS DOES IS PROVIDE A HANDLE ON AN INTERNAL ROUTINE
LISP HAS HAD FOR A LONG TIME ANYWAY. SEE ITEM [D] BELOW.)
FOR NEWIO ONLY:
[A] WHEN THE MAR-BREAK USER INTERRUPT GOES OFF, AN IMPLICIT
(SSTATUS MAR 0 NIL) HAS BEEN PERFORMED. IT IS UP TO
THE MAR-BREAK FUNCTION TO RE-ENABLE THE MAR IF DESIRED.
THIS IS SIMILAR TO THE OPERATION OF THE ALARMCLOCK
FUNCTION. THE INTENTION IS TO HELP PREVENT INFINITE LOOPS.
[B] ALL THE NEW ASYNCHRONOUS INTERRUPTS ANNOUNCED LAST TIME, NAMELY
MAR-BREAK, SYS-DEATH, AND TTY-RETURN, ARE RUN IN (NOINTERRUPT T)
MODE JUST LIKE TTY CHARACTER INTERRUPTS. (I FORGOT TO DOCUMENT
THIS LAST TIME.)
[C] THE VARIABLE DEFAULTF NOW CONTAINS NEWIO'S DEFAULT FILE NAMES,
IN THE FORM OF A NAMELIST. THIS IS SO YOU CAN LAMBDA-BIND
THEM. THE FUNCTION DEFAULTF STILL EXISTS AND IS EQUIVALENT
TO:
(DEFUN DEFAULTF (X)
(SETQ DEFAULTF
(MERGEF (OR X DEFAULTF) DEFAULTF)))
[D] THE MACHINE-ERROR INTERRUPT HAS BEEN CHANGED TO TAKE FOUR
ARGUMENTS. THEY ARE A SYMBOL AND THREE FIXNUMS, IN THAT ORDER
(THIS INVOLVES A REVERSAL OF ITS FORMAR ARGUMENTS.) THE SYMBOL
STILL INDICATES THE ERROR TYPE. THE THREE FIXNUMS ARE,
IN ORDER, THE LOCATION OF THE ERROR, THE PC AS OF THE ERROR,
AND THE JPC AS OF THE ERROR. FOR THE NONCE, THE FIRST AND THIRD
FIXNUMS ARE ALWAYS ZERO, BUT EVENTUALLY WILL CONTAIN INFORMATION
AS CORRECT AS ITS CAN SUPPLY.
AS AN EXAMPLE OF A MACHINE-ERROR FUNCTION, THIS ONE DOES
APPROXIMATELY WHAT THE SYSTEM DEFAULT HANDLER DOES:
(DEFUN MACHINE-ERROR-HANDLER (TYPE LOC PC JPC)
(TERPRI)
(PRINC (COND ((EQ TYPE 'EXAMINE)
'|;REFERENCE TO NON-EXISTENT MEMORY|)
((EQ TYPE 'DEPOSIT)
'|;WRITE INTO READ-ONLY MEMORY|)
((EQ TYPE 'EVAL)
'|;ILLEGAL MACHINE OPERATION|)
((EQ TYPE 'ODDP)
'|;PARITY ERROR|)))
(PRINC '| FROM LOCATION |)
(PRIN1 PC)
(TERPRI)
(PRINC '|;PROGRAM TRAPPED WHILE IN |)
(PRIN1 (SUBR PC)) ;SEE ITEM [4] ABOVE FOR SUBR
(ERROR))
ANOTHER ONE TO USE IS:
(DEFUN MACHINE-ERROR-HANDLER (TYPE LOC PC JPC)
((LAMBDA (ARGS)
(BREAK MACHINE-ERROR))
(LIST (COND ((EQ TYPE 'EXAMINE)
'REFERENCE-TO-NON-EXISTENT-MEMORY)
((EQ TYPE 'DEPOSIT)
'WRITE-INTO-READ-ONLY-MEMORY)
((EQ TYPE 'EVAL)
'ILLEGAL-MACHINE-OPERATION)
((EQ TYPE 'ODDP)
'PARITY-ERROR))
'AT
'LOCATION
LOC
'FROM
'WITHIN
(SUBR PC))))
WHEN THE BREAK OCCURS, THE VARIABLE ARGS, FOLLOWING CONVENTION,
HAS THE USEFUL DATA.
TUESDAY JUNE 15,1976 FM+3D.2H.27M.33S. LISP 1160 - GLS -
NOTE THAT NUMBERED ITEMS ARE FOR BOTH NEWIO AND OLDIO,
WHILE LETTERED ITEMS ARE FOR NEWIO ONLY. NOTE ALSO THAT
NUMBERED AND LETTERED ITEMS ARE INTERMIXED SLIGHTLY.
[0] NEW COMPILER FEATURES
[0A] (PROGN 'COMPILE A1 ... AN) AT TOP LEVEL COMPILES A1 ... AN
[0B] (DEFUN (FOO BAR) ...) PULLS A SPECIAL GENSYM HACK
[0C] (RECOMPL '(A B C ...)) IS USED TO RECOMPILE A FILE
[0D] THE COMPILER NOW RECOGNIZES (CGOL) SPECIALLY
[1] THE VARIABLE ZFUZZ CONTROLS PRECISION OF PLUS AND DIFFERENCE
[2] DEFPROP AND DEFUN DO A REMPROP LOOP, NOT JUST A SINGLE REMPROP
[3] P% IS "LISP TYPEOUT MODE", AND GETS SET UP IN & IF POSSIBLE
[A] TYI ARRANGES TO READ NON-ACTIVATION CHARACTERS
[B] TYI ON TTY DOESN'T CONFUSE CURSORPOS ANY MORE
[C] THE VARIABLES TYI AND TYO CONTAIN THE INITIAL TTY FILE OBJECTS
[D] SETQ OF READ NOW WORKS IN NEWIO; "LOAD" USES IT TOO
[E] RECALL THAT HH$X IS BB$X IN NEWIO
[F] SPECIAL TREATMENT OF CTRL AND META CHARACTERS IN NEWIO
[G] MAR INTERRUPT FEATURE
[F1] THE MAR-BREAK USER INTERRUPT
[F2] (STATUS MAR) AND (SSTATUS MAR)
[F3] SUSPEND SAVES AND RESTORES THE MAR
[F4] ↑G CIRCUMVENTS THE MAR ON RESTORED VARIABLES
[H] OTHER NEW USER INTERRUPTS
[G1] TTY-RETURN (TTY JUST RETURNED TO THE JOB)
[G2] SYS-DEATH AND (STATUS ITS)
[G3] MACHINE-ERROR (MEMORY ERRORS, ILLEGAL OPERS, PARITY ERRORS)
[4] HUNKS PACKAGE
[5A] NEW DATA TYPES
[5B] NEW PRIMITIVES: CXR, RPLACX, HUNK, HUNKIFY, HUNKSIZE
[5C] EQUAL AND SXHASH TREAT HUNKS SPECIALLY
[5D] PRINT TREATS HUNKS SPECIALLY
[5E] TREATMENT OF HUNKS AS LIST STRUCTURE
[5F] (STATUS FEATURE HUNK)
[5G] (STATUS SPCNAMES)
[5H] (STATUS GCSIZE), ETC., AND (ALLOC X)
[I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS
[I1] SPECIAL VARIABLES AND THE JOB TABLE
[I2] CREATE-JOB
[I3] SELECT-JOB
[I4] KILL-JOB
[I5] LOAD-JOB
[I6] JOB-USET-READ AND JOB-USET-WRITE
[I7] EXAMINE-JOB AND DEPOSIT-JOB
[I8] *ATTY AND *DTTY
[I9] AUXILIARY PACKAGES
----------------------------------------------------------------
[0] NEW COMPILER FEATURES
[0A] IF THE FORM (PROGN 'COMPILE A1 ... AN) IS SEEN
AT THE TOP LEVEL OF A FILE, THE COMPILER COMPILES
THE FORMS A1 ... AN AS IF THEY ALL WERE SEEN AT TOP LEVEL.
IN THIS WAY A MACRO CAN "RETURN MULTIPLE FORMS" TO BE
COMPILED (AFTER ALL, THE CONSTRUCT ALSO WORKS IN THE
INTERPRETER).
[0B] (DEFUN (FOO BAR) ...) IN THE INTERPRETER DEFINES FOO
TO HAVE A BAR PROPERTY WHICH IS A LAMBDA EXPRESSION.
THE COMPILER CREATES A GENSYM G0034, OUTPUTS THE FORM
(DEFPROP FOO G0034 BAR),
AND THEN COMPILES THE FUNCTION UNDER THE NAME G0034.
IN THIS WAY (FUNCALL (GET 'FOO 'BAR) ...) WILL ALWAYS
WORK, FOR EXAMPLE.
CONTRAST THIS WITH (DEFUN (FOO BAR BAZ) ...), WHICH
IN THE INTERPRETER GIVES FOO A BAR PROPERTY, AND WHEN
COMPILED GIVES FOO A BAZ PROPERTY.
[0C] THE VARIABLE RECOMPL, IF NON-NIL, CAUSES THE COMPILER
TO IGNORE ALL FORMS IN A FILE EXCEPT DECLARATIONS
AND FUNCTIONS WHOSE NAMES APPEAR IN THE LIST WHICH
IS THE VALUE OF RECOMPL. THE FUNCTION RECOMPL
APPENDS ITS ARGUMENT TO THE RECOMPL LIST. THE IDEA
IS THAT ONE CAN SPECIFY TO THE COMPILER WHICH FUNCTIONS
IN A FILE HAVE CHANGED, AND PRODUCE AN "UPDATE" FASL
FILE CONTAINING ONLY THE DIFFERENCES.
[0D] THE COMPILER NOW RECOGNIZES THE FORM (CGOL), AND
TREATS IT SOMEWHAT LIKE (DECLARE (EVAL (READ))) (CGOL).
[1] IF THE VARIABLE ZFUZZ IS NON-NIL, THEN PLUS AND DIFFERENCE
PERFORM A SPECIAL FUZZ CHECK ON FLOATING POINT NUMBERS.
IF A AND B ARE THE NUMBERS TO BE ADDED (POSSIBLY AFTER CONTAGIOUS
CONVERSION TO FLOATING POINT), THEN IF
A + B < B * ZFUZZ
THEN THE RESULT IS FORCED TO ZERO.
THIS HACK WAS INVENTED FOR BMT; IT MAY CHANGE IF HE DECIDES IT
ISN'T THE RIGHT THING.
[2] BEFORE PUTTING THE NEW PROPERTY ON AN ATOM, DEFPROP AND DEFUN
USED TO PERFORM A SINGLE REMPROP OF THE PROPERTY. NOW THEY LOOP,
REMOVING ALL INSTANCES OF THE PROPERTY FROM THE ATOM. THIS IS
TO ALLOW FOR TRACE, WHICH CREATES ATOMS WITH MULTIPLE OCCURRENCES
OF A GIVEN PROPERTY NAME.
[3] FOR THOSE WHO HACK LISP FROM DDT:
THE SYMBOL P% IS A PUSHJ INSTRUCTION SUITABLE FOR USE AS A DDT
USER TYPEOUT MODE (BY DEPOSITING IT INTO ..TAMPER OR SOME SIMILAR
LOCATION). IF WHEN THE LISP IS STARTED UP DDT HAS A SYMBOL TABLE
LOADED FOR THE LISP, LISP MOVES THE TYPEOUT MODE IN ..TAMPER
TO ..TPERCE, AND DEPOSITS P% IN ..TAMPER. IN THIS WAY THE DDT
COMMAND & MEANS LISP TYPEOUT MODE, AND SQUOZE TYPEOUT MAY BE DONE
VIA $%;.
THIS FORM OF LISP TYPEOUT MODE TYPES OUT $Q, NOT THE CONTENTS
OF . AS P.$X AND PL.$X DO. IF $Q HAS A NON-ZERO LEFT HALF,
THEN BOTH THE LEFT AND RIGHT HALVES ARE PRINTED AS S-EXPRESSIONS,
SEPARATED BY ",,". THIS TYPEOUT MODE IS USEFUL IN CONJUNCTION
WITH THE "RAID REGISTER" FEATURE OF DDT ($V).
REMEMBER, LETTERED ITEMS ARE FOR NEWIO ONLY!
[A] WHEN INPUTTING FROM A TTY USING THE TYI FUNCTION (AS OPPOSED TO
READ OR READLINE), NEWIO ARRANGES TO SET THE %TIACT BIT.
THE EFFECT OF THIS IS TO READ ANY CHARACTER IMMEDIATELY, EVEN
IF NO ACTIVATION CHARACTER HAS BEEN TYPED YET. THIS WILL
ALLEVIATE THE SCREW INVOLVING (STATUS TTY) FOR MOST PEOPLE.
[B] MANY PLACES IN NEWIO ARE NOW MUCH MORE CLEVER ABOUT UPDATING
THE CHARPOS AND LINENUM OF A TTY OUTPUT FILE WHEN INPUT HAS
BEEN DONE ON THE ASSOCIATED TTY. IN PARTICULAR, THE TYI
FUNCTION AND THE PRE-SCAN FUNCTION FOR READ BOTH UPDATE THINGS
CORRECTLY. THE VARIOUS DDT TYPEOUT HACKS ALSO ARRANGE TO
UPDATE THINGS CORRECTLY.
[C] THE VARIABLES TYI AND TYO NOW COME INITIALIZED RESPECTIVELY TO
THE INITIAL TTY INPUT AND OUTPUT FILE OBJECTS. T STILL WORKS
AS AN ARGUMENT TO MOST I/O FUNCTIONS, BUT TO AVOID AMBIGUITIES
USE THE OBJECTS IN TYI AND TYO. ALSO, SEVERAL PLACES IN NEWIO
WHICH USED TO SUPPLY A T FOR A FILE OBJECT NOW SUPPLY THE TTY
FILE OBJECT ITSELF, PARTICULARLY THE PLACE THAT SUPPLIES ARGUMENTS
TO INTERRUPT FUNCTION.
[D] NEWIO NOW UNDERSTANDS THAT IF THE VARIABLE READ IS NON-NIL IT IS
A USER READ FUNCTION. THE LOAD FUNCTION, WHEN LOADING AN EXPR FILE,
USES THIS USER READ FUNCTION ALSO.
[E] MORE FOR DDT HACKERS: SINCE THE ↑H BREAK WAS RENAMED THE ↑B BREAK
IN NEWIO, THE HH$X HACK IS CALLED BB$X IN NEWIO.
[F] IF AN INPUT TTY IS OPEN IN 12-BIT MODE, THE DEFAULT READ PRE-SCAN
FUNCTION TRIES TO THROW AWAY INTERRUPT CHARACTERS. THIS IS SO
THAT TOP CHARACTERS CAN GO THROUGH AS ALPHABETICS, WITHOUT LETTING
CONTROL CHARACTERS CONFUSE THE READER.
IT HAS ALWAYS BEEN TRUE THAT IF A TTY INPUT INTERRUPT FUNCTION WAS
REALLY A NUMBER, THEN IT MEANT THAT THE "INTERNAL" INTERRUPT
ACTION SPECIFIED BY THAT NUMBER WAS TO BE TAKEN; FURTHERMORE,
IF THE 200 OR 400 BIT WAS SET IN THE NUMBER, THE CTRL OR META
BIT WAS REQUIRED TO BE PRESENT IN THE TYPED CHARACTER (THIS
WAS SO THAT CTRL/G WOULD QUIT BUT "PI" WOULD NOT, FOR INSTANCE).
A NEW TWIST IS THAT THE 200000000 AND 400000000 (200 AND 400 IN THE
LEFT HALF) BITS REQUIRE THE ABSENCE OF THE CTRL AND META BITS
IN THE TYPED CHARACTER FOR THE INTERRUPT ACTION TO TAKE PLACE.
THUS, FOR EXAMPLE:
(SSTATUS TTYINT 7 207) ;CTRL/G AND META/CTRL/G QUIT
(SSTATUS TTYINT 7 607) ;ONLY META/CTRL/G QUITS
(SSTATUS TTYINT 7 400000207) ;CTRL/G QUITS, BUT NOT META/CTRL/G
(SSTATUS TTYINT 600000007) ;"PI" QUITS, BUT NOT CTRL/G OR META/CTRL/G
[G] MAR INTERRUPT FEATURE
AT LONG LAST, THE MAR BREAK IS AVAILABLE TO THE LISP USER!
THIS IS A FEATURE WHICH DETECTS WHEN A GIVEN MEMORY LOCATION IS
REFERENCED AND GIVES AN INTERRUPT.
[F1] THE VARIABLE MAR-BREAK, IF NON-NIL, IS A USER INTERRUPT
FUNCTION WHICH IS CALLED WHEN THE MAR BREAK IS FIRED.
IT TAKES ONE ARGUMENT WHICH PRESENTLY IS ALWAYS NIL.
[F2] (STATUS MAR) AND (SSTATUS MAR)
TO "ARM" THE MAR BREAK, IT IS NECESSARY TO SAY
(SSTATUS MAR N LOC)
WHERE N CONTROLS WHEN THE MAR IS FIRED, AND LOC IS
THE PLACE TO MONITOR. N MAY TAKE ON THE FOLLOWING VALUES:
0 TURN OFF THE MAR FEATURE
1 BREAK ON INSTRUCTION FETCH
2 BREAK ON WRITE
3 BREAK ON ALL REFERENCES
ON THE KL-10, THESE ADDITIONAL VALUES ARE REPUTED TO WORK:
10 BREAK ON DATA READ
11 BREAK ON READ AND FETCH
12 BREAK ON READ AND WRITE, BUT NOT FETCH
13 BREAK ON FETCH AND WRITE, BUT NOT READ
THE 4 BIT (EXEC VS. USER MODE) IS IGNORED (USER IS FORCED).
LOC IS ANY S-EXPRESSION; THAT CELL IS THE ONE MONITORED.
THUS (SETQ FOO (LIST 'A 'B)) (SSTATUS MAR 2 FOO)
WILL TRIP THE MAR BREAK IF THE LIST CELL IN FOO IS EVER
RPLACA'D OR RPLACD'D. AS AN EXAMPLE:
(DEFUN MAR-TRACER (X)
(TERPRI)
(PRINC '|NOW THE VARIABLE |)
(PRIN1 THE-MAR-VARIABLE)
(PRINC '| HAS THE VALUE |)
(PRIN1 (SYMEVAL THE-MAR-VARIABLE))
(SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE)))
(SETQ MAR-BREAK 'MAR-TRACER)
(DEFUN MAR FEXPR (X)
(SETQ THE-MAR-VARIABLE (CAR X))
;; MAKE SURE THE VARIABLE HAS A VALUE CELL
(COND ((NOT (BOUNDP THE-MAR-VARIABLE))
(SET THE-MAR-VARIABLE NIL)))
(SSTATUS MAR 2 (GET THE-MAR-VARIABLE 'VALUE)))
(DEFUN UNMAR () (SSTATUS MAR 0 NIL))
(MAR QUUX)
(SETQ QUUX 5)
NOW QUUX HAS THE VALUE 5
(DO ((QUUX 0 (+ QUUX 1))) ((= QUUX 2)) (HACK QUUX))
NOW QUUX HAS THE VALUE 0
NOW QUUX HAS THE VALUE 1
NOW QUUX HAS THE VALUE 2
NOW QUUX HAS THE VALUE 5
NIL
(STATUS MAR) RETURNS A 2-LIST DESCRIBING THE CURRENT STATE
OF THE MAR, OR NIL IF THE MAR IS NOT IN USE. NOTE THAT
USING THE MAR FROM DDT WILL NOT CONFUSE LISP, AND LISP
TRIES NOT TO CONFUSE DDT. IF LISP IS NOT USING THE MAR,
THEN IT DOESN'T EVEN TAKE THE MAR INTERRUPT FROM ITS,
AND SO DDT CAN TRAP IT.
[F3] THE SUSPEND FUNCTION DOES ITS BEST TO SAVE AND RESTORE
THE STATE OF THE MAR.
[F4] WHEN A ↑G FORCES A QUIT BACK TO TOP LEVEL, THE MAR BREAK
IS DISABLED DURING THE UNBINDING OF VARIABLES, AND
RE-ENABLED AFTERWARDS. THIS IS BECAUSE DURING A QUIT
LISP IS NOT IN A GOOD STATE FOR RUNNING USER INTERRUPTS.
[H] OTHER NEW USER INTERRUPTS
[G1] TTY-RETURN, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER THE TTY IS GIVEN TO THE LISP JOB.
(THIS IS DRIVEN BY THE %PIATY BIT IN ITS.)
THIS IS USEFUL FOR TELLING LISP THAT SOME OTHER JOB
MAY HAVE MESSED UP THE SCREEN DISPLAY.
THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL.
[G2] SYS-DEATH, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER THE STATE OF THE SYSTEM IS GOING
DOWN, BEING REVIVED, OR BEGIN DEBUGGED.
(THIS IS DRIVEN BY THE %PIDWN AND %PIDBG BITS IN ITS.)
THE ARGUMENT TO THE FUNCTION IS PRESENTLY ALWAYS NIL.
USEFUL IN CONJUNCTION WITH THIS INTERRUPT IS (STATUS ITS).
THIS RETURNS A LIST OF FIVE NUMBERS:
(1) THE TIME, IN SECONDS, UNTIL THE SYSTEM GOES DOWN,
AS A FLONUM, -1.0 IF THE SYSTEM DOES NOT PLAN
TO GO DOWN, OR -2.0 IF THE SYSTEM IS ALREADY DOWN.
(2) A FIXNUM, NON-ZERO IF THE SYSTEM IS BEING DEBUGGED.
(3) THE NUMBER OF USERS ON THE SYSTEM, AS A FIXNUM.
(4) THE NUMBER OF MEMORY ERRORS THE SYSTEM HAS SURVIVED.
(5) THE TIME IN SECONDS THE SYSTEM HAS BEEN UP,
AS A FLONUM.
THIS INFORMATION COMES FROM THE ITS "SSTATU" SYSTEM CALL.
[G3] MACHINE-ERROR, IF NON-NIL, IS A USER INTERRUPT FUNCTION
WHICH IS RUN WHENEVER A MEMORY PROTECTION VIOLATION,
WRITE INTO READ-ONLY MEMORY, ILLEGAL OPERATION, OR
PARITY ERROR OCCURS. THE FUNCTION RECEIVES TWO ARGUMENTS:
THE FIRST IS THE PROGRAM COUNTER WHEN THE ERROR OCCURRED
(NOT THE MEMORY LOCATION OF THE ERROR!), AND THE SECOND
IS A SYMBOL DESCRIBING THE TYPE OF ERROR:
EXAMINE ATTEMPT TO REFERENCE NON-EXISTENT MEMORY
DEPOSIT WRITE INTO READ-ONLY MEMORY
EVAL ILLEGAL OPERATION
ODDP PARITY ERROR
NOTE THAT THE LISP SYSTEM MAY INTERCEPT SOME OCCURRENCES
OF THESE ERRORS, SINCE THEY CAN BE USED FOR VARIOUS
SHARED-MEMORY HACKS.
IF THE USER INTERRUPT FUNCTION EVER RETURNS, THE PROGRAM
IS RESUMED AT THE PROGRAM COUNTER AS OF THE ERROR;
THAT IS, THE ERRONEOUS OPERATION IS RETRIED. BEWARE
OF LOOPS! IT IS EXPECTED THAT THE INTERRUPT FUNCTION WILL
NORMALLY ERROR OUT.
IF NO USER INTERRUPT FUNCTION IS SUPPLIED, LISP WILL
BEHAVE AS IT ALWAYS HAS, AND ERROR OUT TO TOP LEVEL.
THE NEXT FEATURE IS AVAILABLE IN ALL BIBOP LISPS, WHETHER OLDIO OR NEWIO.
[4] HUNKS PACKAGE
THE HUNKS PACKAGE PROVIDES LISP WITH A KIND OF "RECORD" OR
"SMALL VECTOR" FEATURE. THE HUNK DATA TYPE INTERACTS SMOOTHLY
WITH THE LIST DATA TYPE TO PROVIDE SOME INTERESTING CAPABILITIES.
[5A] A NEW DATA TYPE IS INTRODUCED INTO LISP, THE "HUNK".
HUNKS ARE SHORT VECTORS OF S-EXPRESSIONS. IN THE CURRENT
IMPLEMENTATION THERE ARE ACTUALLY SEVERAL SPACES OF
FOR HUNKS, VARIOUSLY CALLED HUNK4, HUNK8, HUNK16, ETC.
THESE WILL BE EXPLAINED IN DETAIL BELOW. IN SOME
CONTEXTS ORDINARY LIST CELLS ARE CONSIDERED TO BE HUNKS
OF LENGTH 2. HUNKS ARE NOT CONSIDERED TO BE ATOMS;
(ATOM H) RETURNS NIL FOR ANY HUNK H.
[5B] (HUNKP X) IS A PREDICATE WHICH RETURNS T IFF X IS A HUNK.
IN THIS CONTEXT A LIST CELL IS NOT CONSIDERED TO BE A HUNK.
(CXR N H) RETURNS THE N'TH ELEMENT OF THE HUNK H.
(CXR 0 H) IS EQUIVALENT TO (CAR H), AND (CXR 1 H)
IS EQUIVALENT TO (CDR H); IN FACT, THE CAR AND CDR
FUNCTIONS MAY BE USED ON HUNKS AS WELL AS ON LISTS.
(RPLACX N H Z) REPLACES THE N'TH COMPONENT OF H WITH Z.
THE VALUE OF RPLACX IS ITS (MODIFIED) SECOND ARGUMENT.
THUS (RPLACX 0 H Z) IS EQUIVALENT TO (RPLACA H Z),
AND (RPLACX 1 H Z) IS EQUIVALENT TO (RPLACD H Z).
(HUNK N) CREATES A HUNK OF SIZE N AND RETURNS IT.
(HUNK 0) RETURNS NIL, AND (HUNK 1) OR (HUNK 2)
RETURNS A LIST CELL. ALL COMPONENTS ARE INITIALIZED
TO NIL. THE COMPONENTS ARE NUMBERED FROM 0 TO N-1.
(HUNKIFY A0 A2 ... AN-1) IS EQUIVALENT TO
((LAMBDA (H)
(RPLACX 0 A0)
...
(RPLACX N-1 AN-1))
(HUNK N))
THAT IS, IT CREATES A HUNK WHOSE COMPONENTS ARE THE
ARGUMENTS TO HUNKIFY. NOTE THAT, AS FUNNY BOUNDARY
CASES, (HUNKIFY) RETURNS NIL, AND (HUNKIFY X)
IS THE SAME AS (NCONS X).
(HUNKSIZE H) RETURNS THE NUMBER OF COMPONENTS IN
THE HUNK H. HUNKSIZE OF A LIST CELL IS 2; HUNKSIZE
OF NIL IS 0.
[5C] EQUAL WILL COMPARE HUNKS BY DOING A RECURSIVE
COMPONENT BY COMPONENT COMPARISON. SXHASH WILL
COMPUTE THE HASH ON THE BASIS OF ALL COMPONENTS.
[5D] HUNKS ARE PRINTED USING AN EXTENSION TO DOT NOTATION
SUGGESTED BY RMS. SINCE LIST CELLS ARE CONSIDERED TO
BE 2-HUNKS, AND ARE PRINTED AS (CAR . CDR), THE RESULT
OF (HUNKIFY A0 A1 A2 +++ AN-2 AN-1) IS PRINTED AS
(A0 . A2 . A3 . +++ . AN-2 . AN-1 . A1), WHERE "+++"
IS USED AS AN ELLIPSIS TO AVOID CONFUSION WITH THE
DOT NOTATION. THUS WE HAVE:
(HUNKIFY 0) => (0)
(HUNKIFY 0 1) => (0 . 1)
(HUNKIFY 0 1 2) => (0 . 2 . 1)
(HUNKIFY 0 1 2 3) => (0 . 2 . 3 . 1)
THE REASON FOR THE STRANGE PLACEMENT OF A1 IS SO THAT
THE CDR WILL BE LAST. THIS MAY SEEM RATHER KLUDGY, BUT
ACTUALLY LENDS ITSELF TO CERTAIN ELEGANT EXTENSIONS.
ONE IS A GENERAL EXTENSION OF THIS DOT NOTATION TO LIST
NOTATION. AS AN EXAMPLE, CONSIDER:
(A B . C . D E . F G H I . J . K)
THIS IS HOW PRINT WOULD REPRESENT THE RESULT OF:
(HUNKIFY 'A
(HUNKIFY 'B
(HUNKIFY 'E
(HUNKIFY 'G
(HUNKIFY 'H
(HUNKIFY 'I
'K
'J)))
'F)
'C
'D))
THE BASIC IDEA IS THAT CONSECUTIVE ITEMS SEPARATED BY DOTS
ALL BELONG TO THE SAME HUNK; ITEMS SEPARATED ONLY BY SPACES
BELONG TO DIFFERENT HUNKS, AND THE SECOND HUNK IS THE CDR
(I.E. THE (CXR 1)) OF THE FIRST HUNK. ANOTHER WAY TO THINK
ABOUT IT IS TO REPLACE THE TWO PARENS BY SUPER-BRACKETS,
AND THEN BETWEEN TWO ITEMS SEPARATED BY SPACE BUT NOT DOT
INSERT ".(". NOTE THAT THE DEFINITION OF (HUNKIFY X)
AS (NCONS X) CAUSES THE BOUNDARY CONDITION AT THE END OF
THE LIST TO WIN.
AS A SPECIAL CASE, IF THE CDR OF A HUNK (OTHER THAN A LIST
CELL) IS NIL, THAT NIL MAY BE ELIDED (BUT THE PRECEDING DOT
MAY NOT BE ELIDED!). THUS:
(HUNKIFY 1 (HUNKIFY 2 NIL 3 4) 5) => (1 . 5 2 . 3 . 4 .)
(HUNKIFY 'A
(HUNKIFY 'B
(HUNKIFY 'C
NIL
'D)
'E)
'F) => (A . F B . E C . D .)
MAYBE EVENTUALLY READ WILL KNOW HOW TO READ THESE IN.
[5E] MOST OTHER FUNCTIONS WHICH OPERATE ON LIST STRUCTURE
WILL TREAT HUNKS AS LIST CELLS, USING ONLY THE FIRST
TWO POINTERS. (IN PARTICULAR, SUBST AND SUBLIS DO
NOT PRESENTLY KNOW ANYTHING SPECIAL ABOUT HUNKS;
HENCE (SUBST NIL NIL H) WILL NOT COPY A HUNK!)
EVAL ALSO TREATS HUNKS AS LIST CELLS; THUS THE EXPRESSION
(PLUS . FIXNUM . SIMP 1 2 3)
EVALUATES TO 6, IGNORING "FIXNUM" AND "SIMP".
IMAGINE THE POSSIBILITIES FOR HACKING!
[5F] (STATUS FEATURE HUNK) IS NON-NIL IFF LISP HAS THE HUNK STUFF.
[5G] (STATUS SPCNAMES) WILL INCLUDE THE NAMES OF ALL THE ACTUAL
SPACES. IN THE CURRENT IMPLEMENTATION HUNKS HAVE SPACES
FOR HUNKS OF VARIOUS POWERS OF TWO IN SIZE, NAMELY 4., 8.,
16., ... UP TO SOME LIMIT (PROBABLY 16., THOUGH IT IS AN
ASSEMBLY PARAMETER I CAN CHANGE IF ANYONE NEEDS IT).
A HUNK OF 11. POINTERS IS MADE USING ONE OF 16. POINTERS
AND MARKING 5. OF THEM AS UNUSED. IT IS PROBABLY NOT
A GOOD IDEA TO DEPEND ON THIS IMPLEMENTATION, AS ONE CAN
IMAGINE MORE HACKISH IMPLEMENTATIONS (BUDDY BLOCK, ETC.).
[5H] (STATUS GCSIZE), (STATUS GCMAX), (ALLOC T), AND SIMILAR
HACKS ALL KNOW ABOUT THE SPACE NAMES FOR HUNKS AS
RETURNED BY (STATUS SPCNAMES).
THIS LAST MESS IS IN NEWIO ONLY!
[I] HUMBLE PACKAGE FOR HACKING INFERIOR JOBS ON ITS
LIBLSP;HUMBLE FASL CONTAINS A COLLECTION OF PRIMITIVES FOR
HACKING INFERIOR JOBS FROM LISP. SOME LESS PRIMITIVE PACKAGES
WHICH USE HUMBLE ALSO EXIST; JLK IS A GOOD PERSON TO ASK.
[I1] THE FOLLOWING SPECIAL VARIABLES ARE SACRED TO HUMBLE:
CURRENT-JOB
THE-JOB-INPUT-CHANNEL
THE-JOB-OUTPUT-CHANNEL
THE-JOB-INPUT-CHANNEL-FILE-OBJECT
THE-JOB-OUTPUT-CHANNEL-FILE-OBJECT
THE USER OF HUMBLE NEED CONCERN HIMSELF ONLY WITH
CURRENT-JOB. IF NON-NIL, THIS IS THE JOB OBJECT FOR
THE CURRENT JOB. HUMBLE USES TWO I/O CHANNELS, WHICH
ARE USED TO SERVE THE CURRENT JOB.
JOB OBJECTS ARE SIMILAR TO NEWIO FILE OBJECTS. THEIR
FORMAT IS DOCUMENTED (AND SYMBOLS DEFINED) IN LISP;DEFNS >.
HUMBLE AND LISP MAINTAIN INTERNALLY A TABLE OF JOB OBJECTS
(KEPT AT LOCATION JOBTB). IF A JOB OBJECT IS EVER GARBAGE
COLLECTED, GC PRINTS A MESSAGE AND .UCLOSE'S THE JOB.
[I2] (CREATE-JOB <JOBINTFN> <CHNINTFN> <JNAME> <UNAME> <FOREIGN>)
CREATES A JOB OBJECT, AND MAKES IT CURRENT.
<JOBINTFN> AND <CHNINTFN> ARE THE INTERRUPT FUNCTIONS
TO BE USED IF AN INTERRUPT IS RECEIVED ON THE INFERIOR
OR ON THE I/O CHANNELS USED TO SERVICE INFERIORS,
RESPECTIVELY. THEY RECEIVE ONE ARGUMENT, THE JOB
OBJECT OR FILE OBJECT ASSOCIATED WITH THE INTERRUPT.
<UNAME> AND <FOREIGN> ARE OPTIONAL ARGUMENTS.
<UNAME> = NIL (DEFAULT) MEANS YOUR UNAME.
<FOREIGN> = T (NON-DEFAULT) MEANS REQUIRE FOREIGN JOB.
CREATE-JOB RETURNS A LIST OF TWO THINGS:
(1) ONE OF THE FOLLOWING ATOMS:
INFERIOR, REOWNED, FOREIGN
(2) THE NEWLY CREATED JOB OBJECT
IF <FOREIGN> WAS NON-NIL AND THE JOB WAS NOT FOUND,
NIL IS RETURNED.
[I3] (SELECT-JOB <JOB>) MAKES THE SPECIFIED JOB CURRENT IN THE
EXPECTED MODE (FOREIGN OR NOT), RETURNING VALUES AS FOR
CREATE-JOB.
[I4] (KILL-JOB) KILLS THE CURRENT JOB.
[I5] (LOAD-JOB <FILENAME>) OPENS UP FILE <FILENAME> (SPECIFIED
AS A NEWIO NAMELIST OR NAMESTRING) AND LOADS IT INTO TH
CURRENT JOB AS A BINARY PROGRAM (USES THE LOAD SYSTEM CALL).
RETURNS:
NIL WON!
BIN? FILE NOT BIN
FILE? FILE NOT FOUND
[I6] (JOB-USET-READ <NUM>) RETURNS VALUE OF USET VAR <NUM>,
OR NIL IF NO CURRENT JOB.
(JOB-USET-WRITE <NUM> <VAL>) WRITES USET VAR <NUM>,
THEN RETURNS T FOR SUCCESS OR NIL IF NO CURRENT JOB OR THE
CURRENT JOB IS FOREIGN. <NUM> SHOULD HAVE THE 400000 BIT SET.
[I7] (EXAMINE-JOB <LOC>) EXAMINES LOCATION <LOC> OF CURRENT JOB.
RETURNS NIL ON FAILURE (INDICATES BAD ERROR).
(DEPOSIT-JOB <LOC> <VAL>) DEPOSITS <VAL> IN <LOC> OF CURRENT JOB.
RETURNS NIL ON FAILURE (INDICATES BAD ERROR).
[I8] (*ATTY) DOES A .ATTY TO THE CURRENT JOB; (*DTTY) DOES A .DTTY.
BOTH RETURN T FOR SUCCESS AND NIL FOR FAILURE.
[I9] THERE EXIST PACKAGES OF MACROS AND HIGHER-LEVEL FUNCTIONS
FOR HACKING INFERIOR JOBS. SEE JLK OR RZ FOR IDEAS.
MONDAY, MARCH 22,1976 FM+6D.22H.2M.17S. LISP 1130 - GLS & JONL -
[1] (STATUS XUNAME) AND (STATUS XJNAME) NOW EXIST.
[2] FUNNY FORMAT DEFUN ALLOWS ARBITRARY PROPERTY NAMES
[3] PRIN1 DOES VERTICAL BAR AND LOOKAHEAD CLEVERNESS
[4] BREAK MAY TAKE ONE ARGUMENT, DEFAULTING THE SECOND TO T
[5] VALUE OF $P IS THE $P ATOM (NIL => NONE)
[6] *NOPOINT CONTROLS OUTPUT OF LEADING SUPRA-DECIMAL +
THE FOLLOWING CHANGES APPLY TO NEWIO ONLY:
[A] OPENI, OPENO, OPENA HAVE GONE AWAY
[B] (STATUS FILEMODE) RETURNS NIL IF GIVEN A CLOSED FILE.
[C] CLI-MESSAGE INTERRUPT HANDLER
[D] NEW FUNCTIONS: ALLFILES AND FRIENDS
[E] WHO-LINE STATUS CALLS
[F] (STATUS TTYTYPE <OUTPUT-TTY>) RETURNS TCTYP
[G] EXAMPLES OF KEYBOARD PRE-SCAN FUNCTIONS
----------------------------------------------------------------
[1] (STATUS XUNAME) AND (STATUS XJNAME) WERE ADDED AS AN
AUGMENTATION TO (STATUS UNAME) AND (STATUS JNAME).
[2] THE "FUNCTION NAME" IN A DEFUN FORM MAY BE A 3-LIST;
THE FIRST ELEMENT IS THE NAME, THE SECOND THE "EXPR"
PROPERTY NAME, AND THE THIRD THE "SUBR" PROPERTY NAME.
THAT IS, INSTEAD OF USING THE PROPERTY NAME "EXPR"
(OR "FEXPR"), THE INTERPRETER WILL USE THE PROPERTY NAME
WHICH IS THE SECOND ELEMENT, AND THE COMPILER WILL USE
THAT WHICH IS THE THIRD NAME. THE TYPE OF THE FUNCTION
IS STILL DETERMINED BY THE OPTIONAL FLAG "FEXPR"
AND WHETHER THE LAMBDA VARIABLE LIST IS ATOMIC.
EXAMPLE:
(DEFUN (FOO QEXPR QSUBR) (A B) ...)
IN THE INTERPRETER PUTS A LAMBDA EXPRESSION UNDER
THE "QEXPR" PROPERTY OF "FOO", AND IN THE COMPILER
COMPILES A SUBR OF TWO ARGUMENTS HEADED BY THE
LAP STATEMENT (LAP FOO QSUBR) INSTEAD OF
(LAP FOO SUBR).
[3] MOSTLY FOR AESTHETIC REASONS, PRIN1 IS NOW MORE CLEVER
ABOUT PRINTING ATOMS:
(A) IF PRIN1 THINKS VERTICAL BARS WILL LOOK NICER
THAN SLASHES, IT WILL USE THEM.
(B) IF IT LOOKS LIKE THE NEXT ATOM TO PRINT WILL
NOT FIT ON THE LINE, PRIN1 TRIES TO GET
A TERPRI IN BEFORE THE ATOM, THUS AVOIDING
SPLITTING AN ATOM ACROSS A NEWLINE.
THESE HEURISTICS MAY BECOME EVEN MORE CLEVER IN THE FUTURE.
PRINC DOES NOT USE ANY OF THESE HACKS. FLATSIZE USES
THE FIRST, BUT NOT THE SECOND.
[4] THE FORM (BREAK FOO) IS NOW THE SAME AS (BREAK FOO T).
[5] THE BREAK LOOP NO LONGER LOOKS FOR THE ATOM ≠P.
INSTEAD, IT LOOKS FOR THE ATOM WHICH IS THE VALUE
OF THE ATOM ≠P, WHICH IS INITIALLY SET TO '≠P, SO IT
WORKS AS BEFORE BHY DEFAULT. IF ≠P IS NIL, THEN NO
ATOM WILL SERVE THE ≠P FUNCTION.
[6] IF BASE IS GREATER THAN 10., *NOPOINT IF NON-NIL
WILL SUPPRESS THE + WHICH NORMALLY PRECEDES POSITIVE
SUPRA-DECIMAL NUMBERS. FOR BASE = 10., *NOPOINT
STILL SUPPRESSES THE TRAILING DECIMALLL POINT.
THE FOLLOWING CHANGES APPLY TO NEWIO ONLY:
[A] OPENI, OPENO, OPENA HAVE GONE AWAY. USE OPEN
WITH THE "IN", "OUT", OR "APPEND" OPTION IN THE
SECOND ARGUMENT.
[B] (STATUS FILEMODE <FILE>) RETURNS NIL FOR A CLOSED FILE.
FOR OPEN FILES, IT OPERATES AS IT ALWAYS HAS.
FOR A NON-FILE, IT GIVES A WRNG-TYPE-ARG ERROR.
[C] THE ATOM "CLI-MESSAGE" HAS AS ITS VALUE THE USER
INTERRUPT FUNCTION FOR THE CLI DEVICE INTERRUPT.
THE FUNCTION GETS A SINGLE ARGUMENT OF NIL.
IT SHOULD OPEN THE "CLA:" DEVICE IN RESPONSE TO
THE INTERRUPT IN ORDER TOP READ THE MESSAGE.
ONE OF THE OPTIONS IN OPEN'S SECOND ARGUMENT SHOULD
BE "CLA" (AS OPPOSED TO "DSK" OR "TTY"); THIS CAUSES
OPEN TO READ THE FIRST TWO WORDS OF THE FILE AND USE
THEM AS THE FILE NAMES FOR THE TRUENAME FUNCTION. THE
CLA: FILE SHOULD BE OPENED IN BLOCK MODE FOR THIS PURPOSE.
THE DEFAULT CLI-MESSAGE FUNCTION IS NIL, I.E. IGNORE
THE INTERRUPTS.
[D] FOUR NEW FUNCTIONS (AUTOLOADABLE) NOW EXIST FOR LOOKING
AT FILE DIRECTORIES: ALLFILES, DIRECTORY, MAPALLFILES,
AND MAPDIRECTORY.
(ALLFILES X) TAKES A LIST OF NAMELISTS (AND NAMESTRINGS) X AND RETURNS A LIST
OF NAMELISTS IN THE FILE SYSTEM WHICH MATCH ELEMENTS OF X.
THERE IS NO GUARANTEE AS TO THE ORDERING OF THE FILES IN
THE RETURNED LIST. IF A SORTED LIST IS DESIRED, THE SORTCAR
FUNCTION SHOULD BE USED WITH AN APPROPRIATE PREDICATE.
NOTE WELL THAT X IS A *LIST* OF NAMELISTS, AND NOT JUST
A SINGLE NAMELIST; THIS IS AN INCOMPATIBILITY WITH THE ALLFILES
FUNCTION DESCRIBED IN THE MOONUAL.
EXAMPLE: (ALLFILES '(|GLS;ALLFIL| ((DSK TGQ) * SONG) |* BIN|))
RETURNS DESCRIPTORS FOR ALL FILES ON GLS'S DIRECTORY WITH
FIRST NAME "ALLFIL", ALL SONGS ON TGQ, AND ALL DSK FILES IN
ANY DIRECTORY WITH SECOND NAME "BIN".
(DIRECTORY X) IS LIKE (ALLFILES X), BUT INSTEAD OF
NAMELISTS IT RETURNS A LIST OF FILE DESCRIPTORS, WHERE
EACH DESCRIPTOR HAS A NAMELIST IN THE CAR AND A
PROPERTY LIST IN THE CDR. TYPICAL PROPERTIES ARE:
WORDS SIZE OF FILE IN PDP-10 WORDS
CHARACTERS SIZE OF FILE IN ASCII CHARACTERS
BITS SIZE IN BITS (TO BE IMPLEMENTED WHEN ITS SUPPORTS IT)
CREDATE DATE OF CREATION
CRETIME TIME OF CREATION
REFDATE DATE OF MOST RECENT REFERENCE
LINK NAME LINKED TO
PACK PACK NUMBER
UNDUMPED T IF FILE NOT YET BACKED UP ON MAGTAPE
NOREAP T IF NO REAP BIT IS SET
(DIRECTORY X PROPS) IS SIMILAR, BUT INCLUDES ONLY
THE PROPERTIES MENTIONED IN "PROPS" FOR EFFICIENCY.
AS A SPECIAL CASE, OMITTING "LINK" CAUSES LINKS NOT
TO BE INCLUDED AT ALL.
(MAPALLFILES FN X) IS LIKE (MAPC FN (ALLFILES X))
BUT DOESN'T HAVE TO CONS UP THE WHOLE LIST AT ONCE.
(MAPDIRECTORY FN X) AND (MAPDIRECTORY FN X PROPS)
ARE SIMILAR.
MATCHING:
AT PRESENT, THE ONLY MATCHING CAPABILITIES IN ALLFILES
ARE DIRECT NAME EQUALITY AND *, WHICH MATCHES ANYTHING.
* AS A DEVICE NAME IMPLIES DSK.
* AS A DIRECTORY NAME USES ALL DIRECTORIES FOR DSK,
AND THE DEFAULT DIRECTORY FOR ALL OTHER DEVICES.
IN THIS CONTEXT, AI, ML, MC, AND DM ARE *NOT* CONSIDERED
TO BE DSK DEVICES; BUT IN OTHER CONTEXTS THEY ARE.
[E] (SSTATUS WHO1 A B C D) SETS THE .WHO1 USER VARIABLE TO
<.BYTE 8 ? A ? B ? C ? D>
IN MIDAS TERMINOLOGY. A AND C MUST BE FIXNUMS; B AND D
MUST BE FIXNUMS WITH ASCII VALUES, OR CHARACTER OBJECTS.
(SSTATUS WHO2 X) AND (SSTATUS WHO3 X) SET THE .WHO2 AND
.WHO3 USER VARIABLES. X MAY BE A FIXNUM OR A SYMBOL;
IN THE LATTER CASE THE FIRST SIX CHARACTERS ARE USED TO
FORM A SIXBIT WORD.
THE .WHON USER VARIABLES CAUSE INFORMATION TO BE DISPLAYED
IN THE TERMINAL'S WHO-LINE.
THE MEANING OF A, B, C, AND D IS AS FOLLOWS:
VAR BITS MEANING
A 200 IF 1, SUPPRESS ENTIRE WHO-LINE
100 SUPPRESS SPACE BETWEEN HALVES OF .WHO2
70 MODE FOR PRINTING LEFT HALF OF .WHO2
0 DO NOT PRINT
1 DATE IN PACKED FORM:
774000 YEAR MOD 100.
3600 MONTH (1=JANUARY)
174 DAY OF MONTH
2 TIME IN FORTIETHS OF A SECOND,
PRINTED AS HH:MM:SS.T
3 TIME IN HALF-SECONDS,
PRINTED AS HH:MM:SS
4 OCTAL HALFWORD
5 DECIMAL HALFWORD (NO . SUPPLIED)
6 THREE SIXBIT CHARACTERS
7 UNUSED
7 MODE FOR RIGHT HALF OF .WHO2
B 177 IF NON-ZERO, PRINT BETWEEN HALVES OF
.WHO2 AS AN ASCII CHARACTER
200 IF 1, PRINT CHAR TWICE
C 200 IF 1, SUPPRESS SPACE BETWEEN .WHO2
PRINTOUT AND .WHO3 PRINTOUT
OTHERWISE LIKE A, BUT FOR .WHO3.
D LIKE B, BUT FOR .WHO3.
THAT IS, IF THE WHO-LINE IS PRINTED AT ALL, WHAT APPEARS
AT THE END IS THE CHARACTERS:
IIIIXX-JJJJ=KKKKYY+LLLL
WHERE:
IIII IS THE RESULT OF PRINTING THE LEFT HALF
OF .WHO2 AS SPECIFIED BY A'S 70 BITS.
JJJJ RIGHT HALF OF .WHO2, BY A'S 7 BITS.
KKKK LEFT HALF OF .WHO3, BY C'S 70 BITS.
LLLL RIGHT HALF OF .WHO3, BY C'S 7 BITS.
XX ZERO TO TWO CHARACTERS, SPECIFIED BY B.
YY ZERO TO TWO CHARACTERS, SPECIFIED BY D.
- SPACE, UNLESS A'S 100 BIT IS 1.
= SPACE, UNLESS C'S 200 BIT IS 1.
+ SPACE, UNLESS C'S 100 BIT IS 1.
EXAMPLE:
(SSTATUS WHO1 166 0 144 '/!)
(SSTATUS WHO2 'FOOBAR)
(SSTATUS WHO3 (+ (LSH 1234 22) 3456))
CAUSES "FOOBAR 1234!5678" TO APPEAR IN THE WHO-LINE.
THE STATUS FORMS ARE AS FOLLOWS:
(STATUS WHO1) RETURNS A LIST OF FOUR FIXNUMS.
(STATUS WHO2) AND (STATUS WHO3) RETURN FIXNUMS.
[F] (STATUS TTYTYPE <OUTPUT-TTY>) RETURNS THE TCTYP VARIABLE
FOR THE SPECIFIED OUTPUT TTY (IF OMITTED, THIS DEFAULTS
TO T, THE STANDARD OUTPUT TTY). THIS IS THE EXTENSION
IN NEWIO TO OLDIO'S SETTING OF THE VARIABLE "TTY".
FOR COMPATIBILITY, WHEN IT STARTS UP, NEWIO LISP DOES
(SETQ TTY (STATUS TTYTYPE T)).
POSSIBLE VALUES ARE:
0 PRINTING CONSOLE
1 GOOD DATAPOINT
2 "LOSER" DATAPOINT
3 IMLAC
4 TEKTRONIX 4000 SERIES (FORMERLY ARDS)
5 PDP-11 (KNIGHT) TV DISPLAY
6 MEMOREX (FORMERLY HORIZONTAL ARDS)
7 SOFTWARE TTY
10 TERMINET
11 TTY USING ASCII STANDARD DISPLAY SEQUENCES
IN GENERAL, IT IS BETTER NOT TO USE THIS STATUS FUNCTION,
BUT RATHER TO SAY (STATUS FILEMODE <OUTPUT-TTY>) AND
LOOK FOR FLAGS SUCH AS "RUBOUT" AND "CURSORPOS".
[G] EXAMPLES OF KEYBOARD PRE-SCAN FUNCTIONS.
(1) THE KEYBOARD PRE-SCAN FUNCTION IS THE ONE SET BY
(SSTATUS TTYSCAN ...). IT IS THE FUNCTION WHICH HANDLES
RUBOUT AND ↑L PROCESSING. AS AN EXAMPLE, THE FUNCTION
GIVEN HERE IS A VERY CLOSE APPROXIMATION TO THE DEFAULT
PROVIDED BY LISP.
------------------------------------------------------------
SAMPLE TTY PRESCAN FUNCTION -- APPROXIMATELY THE ONE IN LISP
------------------------------------------------------------
(DECLARE (MAPEX))
(DEFUN CONSTANT MACRO (X)
(LIST 'DEFUN (CADR X) 'MACRO '(X) (LIST 'QUOTE (CADDR X))))
(DEFUN LOGAND MACRO (X) (CONS 'BOOLE (CONS '1 (CDR X))))
(DEFUN LOGOR MACRO (X) (CONS 'BOOLE (CONS '7 (CDR X))))
(DEFUN LOGCLR MACRO (X) (CONS 'BOOLE (CONS '4 (CDR X))))
(DEFUN PUSH MACRO (X) (LIST 'SETQ (CADDR X) (LIST 'CONS (CADR X) (CADDR X))))
(DEFUN POP MACRO (X)
(LIST 'PROG2 NIL
(LIST 'CAR (CADR X))
(LIST 'SETQ (CADR X) (LIST 'CDR (CADR X)))))
(CONSTANT TOP 4000) ;NAMES OF BITS FOR KNIGHT KEYBOARDS
(CONSTANT SHIFTLOCK 2000)
(CONSTANT SHIFT 1000)
(CONSTANT META 400)
(CONSTANT CTRL 200)
(CONSTANT ASCII-BITS 177)
(CONSTANT ↑K 13) ;VARIOUS ASCII CHARACTERS
(CONSTANT ↑L 14)
(CONSTANT ↑M 15)
(CONSTANT SPACE 40)
(CONSTANT OPEN-PAREN 50)
(CONSTANT VERTICAL-BAR 174)
(CONSTANT PSEUDOSPACE 203) ;A FAKE SPACE (INTERNAL TO LISP)
(CONSTANT SLASH-SYNTAX 2000) ;BITS IN READER SYNTAX TABLE
(CONSTANT ALTERNATE-SYNTAX 40)
(CONSTANT OPEN-SYNTAX 40000)
(CONSTANT CLOSE-SYNTAX 10000)
(CONSTANT RUBOUT-SYNTAX 1000)
(CONSTANT FORCE-FEED 1000) ;WITH ALTERNATE-SYNTAX
(CONSTANT SPACE-SYNTAX 100000)
(CONSTANT SINGLE-SYNTAX 200000)
(CONSTANT MACRO-SYNTAX 4000)
(CONSTANT WORTHY-SYNTAX 277237) ;"WORTHY" CHARACTERS
(CONSTANT SLASH-FLAG 400000)
(CONSTANT STRING-BEGIN-FLAG 200000)
(CONSTANT STRING-END-FLAG 100000)
(DEFUN TYI7 (IFILE)
((LAMBDA (CH)
(COND ((ZEROP (LOGAND (CTRL) CH)) CH)
((= CH (+ (CTRL) 177)) 177)
(T (LOGAND CH 37))))
(LOGCLR (TYI IFILE) (LOGOR (TOP) (SHIFTLOCK) (SHIFT) (META)))))
(DEFUN REPRINT (CHARS COUNT POS OFILE)
(DECLARE (FIXNUM COUNT))
(COND (OFILE
(AND POS (CURSORPOS (CAR POS) (CDR POS) OFILE))
(AND (PLUSP COUNT)
(DO ((I 0 (1+ I)))
((= I COUNT) (TYO (SPACE) OFILE))
(DECLARE (FIXNUM I))
(TYO (OPEN-PAREN) OFILE)))
(MAPCAR '(LAMBDA (CH) (TYO (LOGAND CH (ASCII-BITS)) OFILE)) CHARS))))
(DEFUN TTY-PRESCAN (IFILE FN PARENSCOUNT)
(DECLARE (FIXNUM PARENSCOUNT))
(PROG (USEFUL STARTPOS OFILE STRING-END BUFFER CH SYNTAX LINMODE TTYREAD COUNT)
(DECLARE (FIXNUM STRING-END CH SYNTAX COUNT))
(AND (SETQ OFILE (STATUS TTYCONS IFILE))
(SETQ STARTPOS (CURSORPOS OFILE)))
(SETQ LINMODE (STATUS LINMODE IFILE))
(SETQ TTYREAD (STATUS TTYREAD IFILE))
(SETQ COUNT PARENSCOUNT)
(SETQ STRING-END -1)
LOOP (SETQ SYNTAX (STATUS SYNTAX (SETQ CH (TYI7 IFILE))))
(COND ((= CH (↑M))
(COND ((EQ FN 'READLINE) (GO DONE))
(LINMODE
(OR (MINUSP STRING-END) (PUSH (PSEUDOSPACE) BUFFER))
(GO DONE)))))
(COND ((OR (= CH (↑K)) (= CH (↑L)))
(COND ((NULL OFILE) (GO LOOP))
(T (COND ((AND (= CH (↑L)) STARTPOS)
(CURSORPOS 'C OFILE))
(T (TERPRI OFILE)))
(SETQ STARTPOS (CURSORPOS OFILE))
(REPRINT (REVERSE BUFFER) PARENSCOUNT NIL OFILE)
(GO LOOP))))
((AND (NOT (EQ FN 'READLINE))
(PLUSP (LOGAND SYNTAX (SLASH-SYNTAX))))
(PUSH CH BUFFER)
(PUSH (LOGOR (SLASH-FLAG) (TYI7)) BUFFER)
(SETQ USEFUL T)
(GO LOOP))
((AND (PLUSP (LOGAND SYNTAX (RUBOUT-SYNTAX)))
(ZEROP (LOGAND SYNTAX (ALTERNATE-SYNTAX))))
(COND (BUFFER
(AND OFILE
(OR (RUBOUT (LOGCLR (SETQ CH (POP BUFFER))
(LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG)))
OFILE)
(REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE)))
(COND ((PLUSP (LOGAND CH (SLASH-FLAG)))
(AND OFILE
(OR (RUBOUT (POP BUFFER) OFILE)
(REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE))))
((NOT (MINUSP STRING-END))
(AND (PLUSP (LOGAND CH (STRING-BEGIN-FLAG)))
(SETQ STRING-END -1)))
((PLUSP (LOGAND CH (STRING-END-FLAG)))
(SETQ STRING-END (LOGAND CH (ASCII-BITS))))
((PLUSP (LOGAND (SETQ SYNTAX
(STATUS SYNTAX
(LOGCLR CH
(LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG)))))
(OPEN-SYNTAX)))
(SETQ COUNT (- COUNT 1)))
((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX)))
(SETQ COUNT (+ COUNT 1)))))
(T (AND OFILE (TERPRI OFILE))))
(GO LOOP))
((EQ FN 'READLINE)
(PUSH CH BUFFER)
(GO LOOP))
((NOT (MINUSP STRING-END))
(COND ((= CH STRING-END)
(PUSH (LOGOR CH (STRING-END-FLAG)) BUFFER)
(SETQ STRING-END -1))
(T (PUSH CH BUFFER)))
(GO LOOP))
((AND (PLUSP (LOGAND SYNTAX (FORCE-FEED)))
(PLUSP (LOGAND SYNTAX (ALTERNATE-SYNTAX))))
(GO DONE))
((PLUSP (LOGAND SYNTAX (SPACE-SYNTAX)))
(COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD))
(PUSH CH BUFFER)
(GO LOOP))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (SINGLE-SYNTAX)))
(COND ((OR (PLUSP COUNT) LINMODE (NOT TTYREAD))
(SETQ USEFUL T)
(PUSH CH BUFFER)
(GO LOOP))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (MACRO-SYNTAX)))
((LAMBDA (MAC)
(COND ((EQ MAC '+INTERNAL-/;-MACRO)
(PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER)
(SETQ STRING-END (↑M)))
((EQ MAC '+INTERNAL-/|-MACRO)
(PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER)
(SETQ STRING-END (VERTICAL-BAR)))
(T (PUSH CH BUFFER))))
(CAR (STATUS MACRO (+ CH 0))))
(SETQ USEFUL T)
(GO LOOP))
((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX)))
(SETQ COUNT (+ COUNT 1))
(SETQ USEFUL T)
(PUSH CH BUFFER)
(GO LOOP))
((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX)))
(COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD))
(COND ((PLUSP (SETQ COUNT (- COUNT 1)))
(PUSH CH BUFFER)
(GO LOOP))
(T (GO DONE))))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (WORTHY-SYNTAX)))
(PUSH CH BUFFER)
(SETQ USEFUL T)
(GO LOOP))
(T (PUSH CH BUFFER) (GO LOOP)))
DONE (AND OFILE
((LAMBDA (POS)
(LINENUM OFILE (CAR POS))
(CHARPOS OFILE (CDR POS)))
(CURSORPOS OFILE)))
(PUSH CH BUFFER)
(SETQ BUFFER (NREVERSE BUFFER))
(MAP '(LAMBDA (X)
(AND (PLUSP (LOGAND (CAR X) (LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG))))
(RPLACA X (LOGCLR (CAR X) (LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG))))))
BUFFER)
(RETURN BUFFER)))
AS AN EXAMPLE OF HOW YOU MIGHT CHANGE THIS, HERE IS A SLIGHT
MODIFICATION TO GIVE ONE THE "PARENS BALANCE WINDOW" PROPOSED
BY GREENBLATT:
-------------------------------------------------
TTY PRESCAN FUNCTION WITH PARENS BALANCING WINDOW
-------------------------------------------------
(DECLARE (ARGS 'CURSORPOS '(0 . 3))
(SPECIAL IFILE OFILE)
(DEFPROP TTYRE A STATUS)
(DEFPROP TTYSI A STATUS)
(DEFPROP TTYCO A STATUS)
(DEFPROP LINMO A STATUS)) ;FIX NCOMPL BUGS
(DECLARE (MAPEX T) (NEWIO T))
(DEFUN CONSTANT MACRO (X)
(LIST 'DEFUN (CADR X) 'MACRO '(X) (LIST 'QUOTE (CADDR X))))
(DEFUN LOGAND MACRO (X) (CONS 'BOOLE (CONS '1 (CDR X))))
(DEFUN LOGOR MACRO (X) (CONS 'BOOLE (CONS '7 (CDR X))))
(DEFUN LOGCLR MACRO (X) (CONS 'BOOLE (CONS '4 (CDR X))))
(DEFUN PUSH MACRO (X) (LIST 'SETQ (CADDR X) (LIST 'CONS (CADR X) (CADDR X))))
(DEFUN POP MACRO (X)
(LIST 'PROG2 NIL
(LIST 'CAR (CADR X))
(LIST 'SETQ (CADR X) (LIST 'CDR (CADR X)))))
(CONSTANT TOP 4000) ;NAMES OF BITS FOR KNIGHT KEYBOARDS
(CONSTANT SHIFTLOCK 2000)
(CONSTANT SHIFT 1000)
(CONSTANT META 400)
(CONSTANT CTRL 200)
(CONSTANT ASCII-BITS 177)
(CONSTANT ↑K 13) ;VARIOUS ASCII CHARACTERS
(CONSTANT ↑L 14)
(CONSTANT ↑M 15)
(CONSTANT SPACE 40)
(CONSTANT OPEN-PAREN 50)
(CONSTANT VERTICAL-BAR 174)
(CONSTANT PSEUDOSPACE 203) ;A FAKE SPACE (INTERNAL TO LISP)
(CONSTANT SLASH-SYNTAX 2000) ;BITS IN READER SYNTAX TABLE
(CONSTANT ALTERNATE-SYNTAX 40)
(CONSTANT OPEN-SYNTAX 40000)
(CONSTANT CLOSE-SYNTAX 10000)
(CONSTANT RUBOUT-SYNTAX 1000)
(CONSTANT FORCE-FEED 1000) ;WITH ALTERNATE-SYNTAX
(CONSTANT SPACE-SYNTAX 100000)
(CONSTANT SINGLE-SYNTAX 200000)
(CONSTANT MACRO-SYNTAX 4000)
(CONSTANT WORTHY-SYNTAX 277237) ;"WORTHY" CHARACTERS
(CONSTANT SLASH-FLAG 400000)
(CONSTANT STRING-BEGIN-FLAG 200000)
(CONSTANT STRING-END-FLAG 100000)
(DECLARE (FIXNUM (TYI7 NIL)))
(DEFUN TYI7 (IFILE)
((LAMBDA (CH)
(COND ((ZEROP (LOGAND (CTRL) CH)) CH)
((= CH (+ (CTRL) 177)) 177)
(T (LOGAND CH 37))))
(LOGCLR (TYI IFILE) (LOGOR (TOP) (SHIFTLOCK) (SHIFT) (META)))))
(DEFUN REPRINT (CHARS COUNT POS OFILE)
(DECLARE (FIXNUM COUNT))
(COND (OFILE
(AND POS (CURSORPOS (CAR POS) (CDR POS) OFILE))
(AND (PLUSP COUNT)
(DO ((I 0 (1+ I)))
((= I COUNT) (TYO (SPACE) OFILE))
(DECLARE (FIXNUM I))
(TYO (OPEN-PAREN) OFILE)))
(MAPCAR '(LAMBDA (CH) (TYO (LOGAND CH (ASCII-BITS)) OFILE)) CHARS))))
(DEFUN PROMPTER (BUFFER SIZE OFILE)
(AND OFILE
((LAMBDA (CHARS POS HAUMANY)
(CURSORPOS 0 (- (CDR SIZE) HAUMANY 5) OFILE)
(CURSORPOS 'L OFILE)
(DO ((I 0 (1+ I))
(L CHARS (CDR L)))
((OR (NULL L)
(= (CAR L) (↑M))
(= I HAUMANY)))
(DECLARE (FIXNUM I))
(TYO (LOGAND (CAR L) (ASCII-BITS))))
(CURSORPOS (CAR POS) (CDR POS) OFILE))
(DO ((X BUFFER (CDR X))
(N 0 ((LAMBDA (SYNTAX)
(COND (STRING N)
((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX)))
(- N 1))
((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX)))
(+ N 1))
(T N)))
(STATUS SYNTAX (LOGAND (CAR X) (ASCII-BITS)))))
(STRING NIL (COND ((PLUSP (LOGAND (CAR X) (STRING-BEGIN-FLAG))) NIL)
((PLUSP (LOGAND (CAR X) (STRING-END-FLAG))) T)
(T STRING)))
(CHARS NIL (CONS (CAR X) CHARS)))
((OR (MINUSP N) (NULL X)) CHARS)
(DECLARE (FIXNUM N)))
(CURSORPOS OFILE)
(// (CDR SIZE) 2))))
(DEFUN TTY-PRESCAN (IFILE FN PARENSCOUNT)
(DECLARE (FIXNUM PARENSCOUNT))
(PROG (USEFUL STARTPOS OFILE STRING-END BUFFER CH SYNTAX LINMODE TTYREAD COUNT SIZE)
(DECLARE (FIXNUM STRING-END CH SYNTAX COUNT))
(COND ((SETQ OFILE (STATUS TTYCONS IFILE))
(SETQ STARTPOS (CURSORPOS OFILE))
(SETQ SIZE (STATUS TTYSIZE OFILE))))
(SETQ LINMODE (STATUS LINMODE IFILE))
(SETQ TTYREAD (STATUS TTYREAD IFILE))
(SETQ COUNT PARENSCOUNT)
(SETQ STRING-END -1)
LOOP (SETQ SYNTAX (STATUS SYNTAX (SETQ CH (TYI7 IFILE))))
(COND ((= CH (↑M))
(COND ((EQ FN 'READLINE) (GO DONE))
(LINMODE
(OR (MINUSP STRING-END) (PUSH (PSEUDOSPACE) BUFFER))
(GO DONE)))))
(COND ((OR (= CH (↑K)) (= CH (↑L)))
(COND ((NULL OFILE) (GO LOOP))
(T (COND ((AND (= CH (↑L)) STARTPOS)
(CURSORPOS 'C OFILE))
(T (TERPRI OFILE)))
(SETQ STARTPOS (CURSORPOS OFILE))
(REPRINT (REVERSE BUFFER) PARENSCOUNT NIL OFILE)
(PROMPTER BUFFER SIZE OFILE)
(GO LOOP))))
((AND (NOT (EQ FN 'READLINE))
(PLUSP (LOGAND SYNTAX (SLASH-SYNTAX))))
(PUSH CH BUFFER)
(PUSH (LOGOR (SLASH-FLAG) (TYI7 IFILE)) BUFFER)
(SETQ USEFUL T)
(GO LOOP))
((AND (PLUSP (LOGAND SYNTAX (RUBOUT-SYNTAX)))
(ZEROP (LOGAND SYNTAX (ALTERNATE-SYNTAX))))
(COND (BUFFER
(AND OFILE
(OR (RUBOUT (LOGCLR (SETQ CH (POP BUFFER))
(LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG)))
OFILE)
(REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE)))
(COND ((PLUSP (LOGAND CH (SLASH-FLAG)))
(AND OFILE
(OR (RUBOUT (POP BUFFER) OFILE)
(REPRINT (REVERSE BUFFER) PARENSCOUNT STARTPOS OFILE))))
((NOT (MINUSP STRING-END))
(AND (PLUSP (LOGAND CH (STRING-BEGIN-FLAG)))
(SETQ STRING-END -1)))
((PLUSP (LOGAND CH (STRING-END-FLAG)))
(SETQ STRING-END (LOGAND CH (ASCII-BITS))))
((PLUSP (LOGAND (SETQ SYNTAX
(STATUS SYNTAX
(LOGCLR CH
(LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG)))))
(OPEN-SYNTAX)))
(PROMPTER BUFFER SIZE OFILE)
(SETQ COUNT (- COUNT 1)))
((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX)))
(PROMPTER BUFFER SIZE OFILE)
(SETQ COUNT (+ COUNT 1)))))
(T (AND OFILE (TERPRI OFILE))))
(GO LOOP))
((EQ FN 'READLINE)
(PUSH CH BUFFER)
(GO LOOP))
((NOT (MINUSP STRING-END))
(COND ((= CH STRING-END)
(PUSH (LOGOR CH (STRING-END-FLAG)) BUFFER)
(SETQ STRING-END -1))
(T (PUSH CH BUFFER)))
(GO LOOP))
((AND (PLUSP (LOGAND SYNTAX (FORCE-FEED)))
(PLUSP (LOGAND SYNTAX (ALTERNATE-SYNTAX))))
(GO DONE))
((PLUSP (LOGAND SYNTAX (SPACE-SYNTAX)))
(COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD))
(PUSH CH BUFFER)
(PROMPTER BUFFER SIZE OFILE)
(GO LOOP))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (SINGLE-SYNTAX)))
(COND ((OR (PLUSP COUNT) LINMODE (NOT TTYREAD))
(SETQ USEFUL T)
(PUSH CH BUFFER)
(GO LOOP))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (MACRO-SYNTAX)))
((LAMBDA (MAC)
(COND ((EQ MAC '+INTERNAL-/;-MACRO)
(PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER)
(SETQ STRING-END (↑M)))
((EQ MAC '+INTERNAL-/|-MACRO)
(PUSH (LOGOR CH (STRING-BEGIN-FLAG)) BUFFER)
(SETQ STRING-END (VERTICAL-BAR)))
(T (PUSH CH BUFFER))))
(CAR (STATUS MACRO (+ CH 0))))
(SETQ USEFUL T)
(GO LOOP))
((PLUSP (LOGAND SYNTAX (OPEN-SYNTAX)))
(SETQ COUNT (+ COUNT 1))
(SETQ USEFUL T)
(PUSH CH BUFFER)
(PROMPTER BUFFER SIZE OFILE)
(GO LOOP))
((PLUSP (LOGAND SYNTAX (CLOSE-SYNTAX)))
(COND ((OR (PLUSP COUNT) (NOT USEFUL) LINMODE (NOT TTYREAD))
(COND ((PLUSP (SETQ COUNT (- COUNT 1)))
(PUSH CH BUFFER)
(PROMPTER BUFFER SIZE OFILE)
(GO LOOP))
(T (GO DONE))))
(T (GO DONE))))
((PLUSP (LOGAND SYNTAX (WORTHY-SYNTAX)))
(PUSH CH BUFFER)
(SETQ USEFUL T)
(GO LOOP))
(T (PUSH CH BUFFER) (GO LOOP)))
DONE (AND OFILE
((LAMBDA (POS)
(LINENUM OFILE (CAR POS))
(CHARPOS OFILE (CDR POS)))
(CURSORPOS OFILE)))
(PUSH CH BUFFER)
(SETQ BUFFER (NREVERSE BUFFER))
(MAP '(LAMBDA (X)
(AND (PLUSP (LOGAND (CAR X) (LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG))))
(RPLACA X (LOGCLR (CAR X) (LOGOR (SLASH-FLAG)
(STRING-BEGIN-FLAG)
(STRING-END-FLAG))))))
BUFFER)
(PROMPTER NIL SIZE OFILE)
(RETURN BUFFER)))
(SSTATUS TTYSCAN 'TTY-PRESCAN)
WEDNESDAY JUNE 11,1975 NM+2D.17H.37M.36S. LISP 1076 - GLS -
TRY NEWIO!
BRIEF SYNOPSIS:
FOR ALL LISPS:
[1] PRIN1, PRINC, AND PRINT NOW ALWAYS RETURN T
[2] NEW FUNCTION: PROGV DOES DYNAMIC VARIABLE BINDING
[3] NEW FUNCTION: MAPATOMS MAPS OVER ALL ATOMS IN AN OBARRAY
[4] FLATC HAS BEEN SPEEDED UP FOR SYMBOLS
FOR NEWIO:
[A] EDIT NOW WORKS
[B] NEW FUNCTION: LOAD LOADS UP BOTH EXPR AND FASL FILES
[C] NEW FUNCTION: INCLUDE IS LIKE A MIDAS .INSRT
[D] UREAD'S EOF HANDLER HAS CHANGED
[E] NEW FUNCTION: FILEPOS IS FINALLY IMPLEMENTED
[F] (STATUS FILEMODE) RETURNS FILEPOS INDICATOR IF APPROPRIATE
----------------------------------------------------------------
[1] PRIN1, PRINC, AND PRINT NOW ALL RETURN T INSTEAD OF
THEIR ARGUMENTS. THIS IS A BELATED FAST ARITHMETIC MOD.
[2] (PROGV <VAR-LIST> <VALUE-LIST> <FORM1> <FORM2> ... <FORMN>)
EVALUATES <FORM1> ... <FORMN> AS A PROGN IN AN ENVIRONMENT
CREATED BY BINDING THE SYMBOLS IN <VAR-LIST> TO THE
RESPECTIVE VALUES IN <VALUE-LIST>. THAT IS, THE FIRST
TWO ARGUMENTS TO PROGV ARE EVALUATED; THE FIRST MUST
PRODUCE A LIST OF SPECIAL VARIABLES, AND THE SECOND
A LIST OF VALUES. THE VARIABLES ARE THEN BOUND TO THE
VALUES. IF TOO FEW VALUES ARE SUPPLIED, THE REST OF
THE VARIABLES ARE BOUND TO NIL. IF TOO MANY VALUES
ARE SUPPLIED, THE EXCESS VALUES ARE IGNORED.
THE BODY OF THE PROGV IS THEN EVALUATED AS A PROGN,
THE VARIABLES UNBOUND TO THEIR OLD VALUES, AND THE
VALUE OF THE LAST FORM IS RETURNED.
EXAMPLE:
(SETQ A 'FOO)
(SETQ B 'BAR)
(PROGV (LIST A B 'B) (LIST B) (LIST A B FOO BAR))
==> (FOO NIL BAR NIL)
[3] (MAPATOMS <FN>) MAPS THE FUNCTION <FN> OF ONE ARGUMENT
OVER ALL SYMBOLS IN THE CURRENT OBARRAY, AND THEN
RETURNS NIL. EXAMPLE:
(MAPATOMS (FUNCTION (LAMBDA (X)
(AND (= (FLATC X) 11.)
(PRINT X)))))
WOULD PRINT:
NOINTERRUPT
GC-OVERFLOW
AND RETURN NIL.
A SECOND ARGUMENT MAY BE SUPPLIED, WHICH MUST BE AN
OBARRAY (*NOT* AN ATOM WITH AN OBARRAY AS AN ARRAY
PROPERTY!!!). THE FUNCTION IS THEN MAPPED OVER THE
SPECIFIED OBARRAY.
[4] FLATC HAS SPECIAL SPEED-OF-LIGHT CODE FOR SYMBOLS,
IN CASE ANYONE WANTS TO KNOW...
----------------------------------------------------------------
[A] THE EDIT PACKAGE NOW WORKS CORRECTLY IN NEWIO.
[B] THE LOAD FUNCTION TAKES A NEWIO FILE NAME AS ITS ARGUMENT,
AND ATTEMPTS TO LOAD IT UP. IF NO SECOND FILE NAME IS
GIVEN, IT FIRST TRIES USING "FASL", AND THEN ">".
AFTER FINDING THE FILE, IT DETERMINES WHETHER IT IS A FASL
FILE OR NOT (BY LOOKING AT THE FIRST WORD). IF A FASL FILE,
IT CALLS FASLOAD TO LOAD THE FILE. OTHERWISE, IT OPENS
THE FILE AS AN ASCII FILE, PUSHES IT ON THE INSTACK,
AND PERFORMS A READ-EVAL LOOP UNTIL END OF FILE.
BECAUSE OF THIS MODE OF OPERATION, INCLUDE'S (SEE [C])
WILL WORK IN LOADED FILES.
THE IDEA IS THAT YOU SAY (LOAD 'FOO) AND IT LOADS FOO.
[C] INCLUDE IS A FEXPR WHICH TAKES A FILE NAME.
(DEFUN INCLUDE FEXPR (X) (INPUSH (OPEN (CAR X))))
THAT IS, ONE TYPICALLY WOULD WRITE:
(INCLUDE |DSK:GLS;FOO >|)
OR WHATEVER.
IF THIS IS EVALUATED IN THE COURSE OF UREAD'ING OR
LOAD'ING A FILE, THE EFFECT IS TO INCLUDE THE TEXT OF
THE INSERTED FILE IN PLACE OF THE INCLUDE. (OF COURSE,
USER-SUPPLIED EOF HANDLERS MAY ALTER THIS SOMEWHAT.)
EVENTUALLY THE @ PROGRAM WILL UNDERSTAND INCLUDE'S.
[D] UREAD'S EOF HANDLER WAS FORMERLY DEFINED TO BE:
(LAMBDA (FILE EOFVAL) (SETQ UREAD NIL))
IT IS NOW DEFINED TO BE:
(LAMBDA (FILE EOFVAL) (SETQ UREAD NIL) EOFVAL)
SO THAT READ OF ONE ARGUMENT WILL WORK CORRECTLY
ON A UREAD FILE.
[E] FILEPOS IS NOW IMPLEMENTED, EXCEPT THAT IT DOES NOT
WORK YET TO TRY TO SET THE FILEPOS ON AN OUTPUT FILE.
(ONE MAY READ THE CURRENT FILEPOS WHILE WRITING,
HOWEVER.) FILEPOS MEASURES POSITION IN TERMS OF
CHARACTERS FOR ASCII FILES, AND FIXNUMS (WORDS)
FOR FIXNUM FILES.
[F] (STATUS FILEMODE FOO) WILL RETURN THE FLAG "FILEPOS"
IN THE CDR OF ITS RESULT IFF THE FILE FOO WILL WORK
FOR BOTH READING AND SETTING THE FILEPOS.
TUESDAY MAY 27,1975 FM+2D.18H.3M.18S. NEWIO 1061 - GLS -
Note that ONEWIO↑K or OQ↑K gets an old version of NEWIO (Q).
Brief synopsis:
[1] MSGFILES controls output of "messages" from LISP.
[2] File arrays as arguments to SYSCALL supply channel number.
[3] ERRPRINT may take a second arg (output files).
[4] (CLOSE foo) does (SSTATUS TTYCONS foo NIL) if foo is a tty.
[5] OPEN tends to reset file array attributes.
[6] A sample program to do rubout processing.
[7] A sample program to use 12-bit chars on Knight keyboards.
[8] A sample program to use the echo area.
[9] A sample program to hack the line printer.
[10] A sample program to create "dribble files" using ECHOFILES.
----------------------------------------------------------------
[1] The variable MSGFILES is like the variable OUTFILES,
except that "messages" like GC messages, error messages,
";BKPT barf", etc. are output to MSGFILES files and not
to OUTFILES files. (Recall that OUTFILES is the list of
default user output files, controlled by ↑R. There is no
switch equivalent to ↑R for MSGFILES.) Initially the value
of MSGFILES is (T), i.e. messages go only to the tty.
[2] If a file array is given as an input argument to SYSCALL
in newio, the system actually gives the .CALL the channel
number of the file array. If T is given, the channel number
of the input tty file T is supplied. Thus:
(SYSCALL 0 'SCML T 7)
sets the number of command lines (size of echo area) to 7
for the standard input tty.
By the way, if you ever use SYSCALL for something you think
LISP might want to provide as a separate function (for ease of
use, compatibility with other systems, etc.) please send
mail to GLS describing the usage.
[3] The ERRPRINT function now takes an optional second argument
like PRINT to specify the output files to print the message
on. Thus, for example,
(ERRPRINT NIL MSGFILES)
prints the most recent error message onto the message files.
[4] Closing a tty file will undo any (SSTATUS TTYCONS) pair
that that file may be engaged in. Since OPEN uses CLOSE
if given an actual file as first argument, note that it
may be necessary to re-TTYCONS two tty files after
re-opening one or both of them.
[5] In general, re-opening a file (especially a tty) resets
the file array for that tty. LISP makes an effort to
save some important attributes about the input and output
T files (standard tty) when starting up and re-opening the
T tty files, but this is not a general attribute of the OPEN
function. Thus, after re-opening a file array, the attributes
of that file array (such as (SSTATUS TTYCONS), (SSTATUS TTY),
(SSTATUS TTYINT), (EOFFN) or (ENDPAGEFN), etc.) should be
set up all over again.
[6] Sometimes a user may want to do his own rubout processing
without having to hack the ultimately hairy (SSTATUS TTYSCAN)
feature. Here is a function showing the correct way to
do rubout processing for simple applications.
;;; This function takes two arguments.
;;; The first is the character (a fixnum) which terminates input.
;;; The second is the file to read from (T for tty input).
;;; It works to use this function on a non-tty.
;;; The result returned is a list of fixnums representing the
;;; characters read and not rubbed out. The termination character
;;; is not included in this list, but thrown away.
;;; Over-rubout does not do anything at all.
;;; Example: (SNARF-CHARS-UNTIL 3 t)
;;; reads characters from T (the tty) until a ↑C (ascii code 3)
;;; is typed. If the user types "FOOBER<rubout><rubout>AR↑C",
;;; then the result will be (106 117 117 102 101 122).
;;;
;;; Note the use of the newio function RUBOUT to rub characters out.
;;; If RUBOUT returns NIL, then it could not rub the character out
;;; (e.g. it was tab or cr); it is necessary then to re-print the
;;; list of buffered characters.
;;; TTYP is non-NIL iff the input file is a tty.
;;; ECHO-FILE is the associated output file of the input tty,
;;; or NIL if the input file has none or isn't a tty.
;;; START-POS is the original cursor position in ECHO-FILE, or NIL.
;;; BUFFER is a list of characters read in reverse order.
(DEFUN SNARF-CHARS-UNTIL (ENDCHAR INPUT-FILE)
((LAMBDA (TTYP)
((LAMBDA (ECHO-FILE)
(DO ((START-POS (AND ECHO-FILE (CURSORPOS ECHO-FILE)))
(BUFFER)
(CHAR (TYI INPUT-FILE) (TYI INPUT-FILE)))
((= CHAR ENDCHAR) (NREVERSE BUFFER))
(COND ((= CHAR 177)
(AND BUFFER
ECHO-FILE
(OR (RUBOUT (CAR BUFFER) ECHO-FILE)
(PROGN (CURSORPOS (CAR START-POS)
(CDR START-POS)
ECHO-FILE)
(CURSORPOS 'E ECHO-FILE)
(MAPC (FUNCTION (LAMBDA (CH)
(TYO CH ECHO-FILE)))
(REVERSE (CDR BUFFER))))))
(AND BUFFER (SETQ BUFFER (CDR BUFFER))))
(T (SETQ BUFFER (CONS CHAR BUFFER))))))
(AND TTYP (STATUS TTYCONS INPUT-FILE))))
(MEMQ 'TTY (CAR (STATUS FILEMODE INPUT-FILE)))))
[7] This function shows the correct way to re-open the tty
in 12-bit mode on a Knight keyboard. Note that the LISP
system normally folds 12-bit characters down to 7 bits
always, except for the TYI function. Thus the READTABLE
still only has 200 entries, etc.
;;; Open the tty in 12-bit mode. After (12-BIT-OPEN) is done,
;;; (TYI) from the tty will return 12-bit characters. The characters
;;; are as supplied by ITS:
;;; bit value ITS name correspondence
;;; 2.3 4000 %TXTOP TOP
;;; 2.2 2000 %TXSFL SHIFT LOCK
;;; 2.1 1000 %TXSFT SHIFT
;;; 1.9 400 %TXMTA META
;;; 1.8 200 %TXCTL CONTROL
;;; 1.7-1.1 177 %TXASC ascii code
;;; After re-opening the input tty in 12-bit mode, it is necessary
;;; to restore the attributes of the file array.
;;; In this mode, the LISP system control characters are set up
;;; to ignore control characters which do not actually have the
;;; CONTROL bit set. Thus typing TOP-X to get "beta" will not
;;; invoke the system ↑C interrupt. User interrupt character
;;; functions must decide for themselves whether to do such
;;; filtering (they receive the full 12-bit character as an
;;; argument, and so may do this if desired).
(DEFUN 12-BIT-OPEN NIL
((LAMBDA (SCAN-FUNCTION)
(OPEN T '(TTY IN SINGLE FIXNUM)) ;OPEN IN 12-BIT MODE
(SSTATUS TTYCONS T T) ;TIE TO OUTPUT TTY
(SSTATUS TTYSCAN SCAN-FUNCTION) ;SET UP RUBOUT HANDLER
(MAPC (FUNCTION (LAMBDA (CH INT) ;SET UP STANDARD
(SSTATUS TTYINT ; CONTROL CHARACTERS,
CH ; REQUIRING "CONTROL"
(+ INT 200)))) ; KEY FOR ANY EFFECT
'(3 4 7 22 23 24 26 27 30 32)
'(3 4 7 22 30 24 26 27 30 32)))
(STATUS TTYSCAN))) ;OLD RUBOUT HANDLER
[8] Here is a function which opens up and manipulates tty files
such that input is typed in the echo area and output appears
above. Rubout processing happens correctly in the echo area.
Note that it uses TTY-ENDPAGEFN, the **MORE** processor
defined in the previous LISP RECENT.
(DEFUN SPLITSCREEN (ECHOAREASIZE)
((LAMBDA (ECHOTTY VERTICAL)
(SSTATUS TTYCONS T ECHOTTY) ;cons echo area tty to input tty
(PAGEL T (- VERTICAL ECHOAREASIZE)) ;set pagel for main area tty
(ENDPAGEFN T 'TTY-ENDPAGEFN) ;set endpagefn
(SYSCALL 0 'SCML T ECHOAREASIZE) ;set size of echo area
(CURSORPOS 'C T) ;clear screen (why not?)
'DONE)
(OPEN '((TTY)) '(TTY OUT ECHO)) ;file array for echo area tty output
(CAR (STATUS TTYSIZE T))))
Here is a version which causes ALL input and output to happen
in the echo area, leaving the main program area free for graphics
or whatever else.
(DEFUN SMALLSCREEN (ECHOAREASIZE)
(OPEN T '(TTY OUT ECHO))
(SSTATUS TTYCONS T T)
(SYSCALL 0 'SCML T ECHOAREASIZE)
'DONE)
[9] Here are some routines which simulate the old ↑B-↑E feature
of oldio. Since ↑B is a break in newio, ↑A and ↑E are used.
The functions WALBEG and WALEND are as in DDT, and are used
to open and close the wallpaper file. If ↑A discovers that
WALBEG has not been called, the TPL device is used.
;;; WALLPAPER ROUTINES
;;; VALUE OF WALLPAPERFILE, IF NON-NIL, IS FILE ARRAY FOR
;;; WALLPAPER.
;;; ↑A-HANDLER IS INVOKED BY TYPING ↑A. TURNS ON OUTPUT
;;; TO WALLPAPER FILE.
;;; ↑E-HANDLER IS INVOKED BY ↑E. TURNS OFF WALLPAPER OUTPUT.
;;; WALBEG INITIALIZES SETUP TO SPECIFIED FILE.
;;; WALEND TERMINATES THE CURRENT WALLPAPER FILE,
;;; AND NAMES IT IF DESIRED (DEFAULT IS "WPAPER >").
(DECLARE (SPECIAL WALLPAPERFILE OLD↑R))
(SETQ WALLPAPERFILE NIL)
(DEFUN ↑A-HANDLER (F CH)
(OR WALLPAPERFILE (WALBEG TPL))
(OR ↑A (SETQ OLD↑R ↑R))
(SETQ ↑A T)
(SETQ ↑R T)
(OR (MEMQ WALLPAPERFILE OUTFILES)
(SETQ OUTFILES (CONS WALLPAPERFILE OUTFILES))))
(DEFUN ↑E-HANDLER (F CH)
(SETQ ↑R OLD↑R)
(SETQ ↑A NIL)
(SETQ OUTFILES (DELQ WALLPAPERFILE OUTFILES)))
(DEFUN WALBEG FEXPR (DEVDIR)
(WALEND)
(SETQ WALLPAPERFILE
(OPEN (LIST (OR DEVDIR (CAR (DEFAULTF NIL)))
'←WALL←
'PAPER)
'OUT))
T)
(DEFUN WALEND FEXPR (NAME)
(COND (WALLPAPERFILE
(↑E-HANDLER NIL NIL)
(AND NAME (RENAME WALLPAPERFILE NAME))
(CLOSE WALLPAPERFILE)
(SETQ WALLPAPERFILE NIL))))
(SSTATUS TTYINT 1 '↑A-HANDLER)
(SSTATUS TTYINT 5 '↑E-HANDLER)
[10] Here are some functions to create "dribble files",
i.e. files contains both input and output.
;;; (DRIBBLE) opens a dribble output file.
;;; DRIBBLE, if non-nil, is the dribble output file array.
;;; (WIPE FOO BAR) wipes up the current dribble, closing
;;; the file and naming it FOO BAR.
(DECLARE (SPECIAL DRIBBLE))
(DEFUN DRIBBLE NIL
(WIPE /.DRIB/. OUTPUT)
(SETQ DRIBBLE (OPEN '|.DRIB. OUTPUT| 'OUT)))
(SETQ OUTFILES (CONS DRIBBLE OUTFILES))
(SETQ ECHOFILES (CONS DRIBBLE ECHOFILES))
(SETQ MSGFILES (CONS DRIBBLE MSGFILES))
(SETQ ↑R T))
(DEFUN WIPE FEXPR (NAME)
(COND (DRIBBLE
(OR (SETQ OUTFILES (DELQ DRIBBLE OUTFILES))
(SETQ ↑R NIL))
(SETQ ECHOFILES (DELQ DRIBBLE ECHOFILES))
(SETQ MSGFILES (DELQ DRIBBLE MSGFILES))
(CLOSE (RENAME (PROG2 NIL DRIBBLE
(SETQ DRIBBLE NIL))
NAME)))))
FRIDAY APRIL 18,1975 FQ+9H.34M.47S. LISP 1049 - GLS -
A NEW VERSION OF NEWIO IS UP! TRY IT, AND REPORT ANY
LOSSES TO GLS, OR SAY :BUG NEWIO ... ↑C TO DDT.
BRIEF SYNOPSIS:
[0] INCOMPATIBLE CHANGE!!! PRINT, PRIN1, AND PRINC TO GIVE OUT T
[1] COMPILER RESETS GENSYM COUNTER
[2] DEFUN MAY REMOVE THE EXPR-HASH PROPERTY
[3] VERTICAL BAR AND EXCLAMATION POINT AS SYMBOL QUOTERS
[4] NEW PECULIAR FUNCTION: SYSCALL
[5] COMPILER ALLOWS DECLARES IN DO LOOPS
[6] TECHNIQUE: AVOIDING NUMBER CONSING
[7] EVALHOOK
[8] NEW VERSION OF NEWIO OUT
[A] TYIPEEK NOW IMPLEMENTED
[B] ↑Q TO ALLOC AND JCL WORK
[C] (STATUS FILEMODE)
[D] (STATUS TTYINT)
[E] (STATUS TTYCONS)
[F] (STATUS TTYSCAN)
[G] RUBOUT
[H] NEW INTERRUPT SYSTEM
[I] VALUE OF AUTOLOAD IS THE AUTOLOAD FUNCTION
[J] **MORE** INTERRUPTS
[K] FASLOAD WITHIN FASLOAD
[L] ↑X FUNCTION FLUSHED - ↑G REMAINS
[M] FORCE IS FORCE-OUTPUT AGAIN
[N] CLEAR-INPUT AND CLEAR-OUTPUT
----------------------------------------------------------------
[0] A GHOST OF THE PAST LOOMS UP. WHEN NCOMPLR WAS CREATED, WE MADE
SOME DECISIONS THAT, FOR EFFICIENCY REASONS, REQUIRED TYO, PRINT,
PRIN1, AND PRINC TO RETURN SOME PROVABLY NON-NUMERIC VALUE.
GENERALLY, THIS MEANS SOME CONSTANT LIKE T OR NIL. TYO WAS
CHANGED LONG AGO, BUT WE HAVE BEEN WAITING UNTIL THE LAST POSSIBLE
MINUTE TO MAKE THE REQUISITE CHANGE TO THE PRINT SERIES. THE TIME
HAS COME (AND WE HEAR VOICES OF WALRUSES); OUR SYMPATHIES GO OUT
TO THOSE, WHO LIKE US, WILL HAVE TO EXPLORE THEIR CODE TO
ACCOMODATE THIS INCOMPATIBLE CHANGE. HOWEVER, THIS CHANGE WILL
NOT ACTUALLY TAKE EFFECT UNTIL AFTER MAY 19, 1975. IF THE ONLY
USE YOUR EVER MADE OF THE VALUE OR PRINT WAS TO CONTINUE AN "AND",
YOU NEED NOT WORRY. E.G.
(AND (PRED X) (PRINC 'HERE/ WE/ ARE/ ) (PRINT X) (PRINT Y))
WILL STILL WORK ESSENTIALLY THE SAME.
BE WARNED ALSO! THE OLD COMPLR IS ESSENTIALLY DEAD; THERE
WILL BE A FUNERAL FOR IT SOON. NCOMPLR IS NOW QUITE A BIT MORE
BUG-FREE THAN THE OLD COMPLR, AND AFTER COMPLR'S DEMISE,
SYS:TS COMPLR WILL LINK TO SYS:TS NCOMPLR.
[1] NOTE THAT THE COMPILER USES THE GENSYM FUNCTION FOR
GENERATING LAP TAGS, AND RESETS THE GENSYM COUNTER AT
THE BEGINNING OF EACH FUNCTION. THEREFORE GENSYM IS NOT
A RELIABLE WAY TO GENERATE UNIQUE ATOMS FOR USE BY MACROS
IF YOU PLAN TO INTERN THEM (UNINTERNED, THE NAME DOESN'T
MATTER, OF COURSE). SORRY ABOUT THAT.
[2] DEFUN WILL REMOVE THE EXPR-HASH PROPERTY FROM AN ATOM
IF IN EXPR-HASH MODE (DEFUN = T) AND IT INSTALLS A NEW
PROPERTY. THIS IS TO PREVENT LOSSES SUCH AS RE-INSTALLING
THE OLD DEFINITION NOT WORKING.
[3] VERTICAL BAR (ASCII CODE 174) NOW INITIALLY HAS A READ-MACRO
PROPERTY WHICH CAUSES IT TO GOBBLE UP CHARACTERS UNTIL
THE NEXT VERTICAL BAR, AND MAKE AN INTERNED ATOMIC SYMBOL
OUT OF IT. IT IS THUS ANOTHER WAY TO QUOTE CHARACTERS
IN ATOMIC SYMBOLS. TO GET A VERTICAL BAR OR CARRIAGE RETURN
OR SLASH INTO SUCH A CONSTRUCT, USE SLASH. EXAMPLE:
|A /| WILL GOBBLE CHARS UNTIL
THE NEXT /| NOT PRECEDED BY //|
IS THE ATOMIC SYMBOL WITH THE PRINT NAME:
"A | WILL GOBBLE CHARS UNTIL THE NEXT | NOT PRECEDED BY /"
THE CARRIAGE RETURN ISN(T PART OF THE PRINT NAME BECAUSE IT
HAD NO / IN FRONT OF IT. THIS IS SO AN AUTOMATIC TERPRI
FORCED BY THE LINEL WON'T SCREW THINGS UP.
AS A CONCESSION TO DATAPOINT LOSERS, EXCLAMATION POINT
PRESENTLY HAS A SIMLAR PROPERTY. HOWEVER, LOSERS ARE
ADVISED NOT TO PUT ! IN THEIR FILES, AS VERTICAL BAR IS
THE "OFFICIAL" ONE. USERS OF CONNIVER ON DATAPOINTS
HAVE A PROBLEM -- TOUGH NOOGIES.
EVENTUALLY PRIN1 WILL HAVE SOME SMARTS ABOUT OUTPUTTING
VERTICAL BARS. IN NEWIO, THE RUBOUT PROCESSOR IS CLEVER
ABOUT VERTICAL BARS, BUT NOT IN OLDIO -- BEWARE.
[4] THE FUNCTION SYSCALL TAKES FROM TWO TO TEN ARGUMENTS.
THEY ARE:
(1) N, THE NUMBER OF OUTPUT RESULTS DESIRED (A FIXNUM
FROM 0 TO 8); THE RETURN VALUE OF SYSCALL WILL THUS
BE A LIST OF N FIXNUMS. OPTIONALLY, THE "CONTROL"
BITS "C" MAY BE SPECIFIED BY GIVING AS FIRST ARG
N + LSH[C;18.]
(2) NAME OF SYSTEM CALL (ATOMIC SYMBOL).
(3-10) INPUT ARGUMENTS (FIXNUMS).
THE SPECIFIED ITS SYSTEM CALL IS PERFORMED AND A LIST
OF THE RESULTS ARE RETURNED AS FIXNUMS. IF AN ERROR
OCCURS, A FIXNUM (THE ERROR CODE) IS RETURNED INSTEAD
OF THE LIST OF RESULTS.
NO COMPENSATION IS MADE FOR SYSTEM CALLS THAT TAKE
CHANNEL NUMEBSR, AOBJN POINTERS, CLOBBER THEIR
INPUT ARGS, ETC. BEWARE!
EXAMPLE:
(SYSCALL 6 'CNSGET 2)
WILL RETURN A LIST OF SIX FIXNUMS DESCRIBING THE
TTY (OLDIO OPENS THE TTY ON CHANNEL 2 -- NEWIO
USERS, BEWARE!!!).
[5] THE COMPILER NOW ALLOWS LOCAL DECLARATIONS TO BE PUT IN DO
LOOPS IN THE SAME WAY THEY MAY BE IN LAMBDAS AND PROGS.
EXAMPLE, TO FIND THE INDEX OF THE FIRST "FOO" IN THE LIST X:
(DO ((N 0 (1+ N)) (L X (CDR L)))
((NULL L) -1)
(DECLARE (FIXNUM N))
(AND (EQ (CAR L) 'FOO) (RETURN N)))
[6] PROGRAMMING TECHNIQUE:
YOU MAY FIND YOUR FUNCTIONS DOING AN INORDINATE AMOUNT
OF NUMBER CONSING EVEN AFTER USING NCOMPLR. IF SO,
CONSIDER WHETHER ANY OF YOUR FUNCTIONS, WHICH ARE NOT DECLARED
TO BE FIXNUM OR FLONUM FUNCTIONS ARE NEEDLESSLY RETURNING
NUMERICAL RESULTS. E.G.,
(DEFUN BAR (X Y N M)
(COND ((MUMBLE X Y)
(PRINC '/ANSWERS/ ARE:)
(PRIN1 N) (PRINC '/ ) (PRIN1 M) (TERPRI)))
N) ;RANDOM RETURN VALUE
IF BAR IS INDEED USED PRIMARILY FOR EFFECT, THERE IS NO REASON
TO RETURN A NUMERICAL VALUE, WHICH WILL USUALLY CAUSE NCOMPLR
TO OUTPUT A NUMBER-CONS CALL. SOMETIMES, RETURNING A NUMERICAL
RESULT MAY BE PARTIALLY HIDDEN FROM YOUR EYE, AS IN THE CASE OF
FEEDING AN ARG TO A FUNCTION SUCH AS STORE, WHICH RETURNS ONE OF
ITS INPUT ARGS AS RESULTANT VALUE E.G.,
(DEFUN FOO (J N) (STORE (MY-FIXNUM-ARRAY N) J))
THIS WILL STORE THE FIXNUM J INTO SLOT N, AND IT WILL ALSO
RETURN J. UNLESS YOU REALLY NEED FOO TO RETURN J, YOU SHOULD
WRITE
(DEFUN FOO (J N) (STORE (MY-FIXNUM-ARRAY N) J) NIL)
AND LET NIL BE RETURNED. THIS APPLIES TO ANY FUNCTION
WHOSE LAST ACTION WILL PRODUCE A NUMERICAL VALUE, AND WHOSE
PURPOSE IS PRIMARILY TO PERFORM SOME SIDE-EFFECT.
[7] AT LONG LAST, HERE IS SOME (MINIMAL) DOCUMENTATION
ON THE INFAMOUS EVALHOOK FEATURE!
THE EVALHOOK FEATURE WAS INVENTED SO THAT A DYNAMIC
SINGLE-STEP TRACER COULD BE WRITTEN. USING THE
EVALHOOK FEATURE IS A BLACK ART, SO READ ON, BUT
CAREFULLY.
THERE EXIST BOTH A FUNCTION AND A VARIABLE CALLED
"EVALHOOK". THERE IS ALSO A (SSTATUS EVALHOOK).
((STATUS EVALHOOK) EXISTS BUT DOES NOT RETURN ANYTHING
MEANINGFUL AT ALL.)
THE SEMANTICS OF THE VARIABLE EVALHOOK ARE AS FOLLOWS:
WHENEVER THE FUNCTION EVAL IS ENTERED, WHETHER FROM
WITHIN THE SYSTEM OR BY EXPLICIT INVOCATION BY THE USER,
THEN IF THE VALUE OF THE VARIABLE EVALHOOK IS NON-NIL,
AND *RSET IS NON-NIL, AND (SSTATUS EVALHOOK T) HAS BEEN
DONE, THEN EVAL DOES NOT EVALUATE ITS ARGUMENT.
INSTEAD IT ASSUMES THAT THE VALUE OF THE VARIABLE
EVALHOOK IS A FUNCTION OF ONE ARGUMENT. IT FETCHES
THIS FUNCTION, LAMBDA-BINDS EVALHOOK TO NIL, AND
CALLS THE FUNCTION WITH THE ARGUMENT TO EVAL.
THIS FUNCTION THEN HAS THE RESPONSIBILITY FOR EVALUATING
THE FORM AND RETURNING A RESULT. THIS RESULT BECOMES
THE RESULT OF THE ORIGINAL CALL TO EVAL.
IT IS EVIDENT THAT SUCH A FUNCTION CAN DO OTHER THINGS
BESIDES EVALUATE THE FORM; E.G. IT CAN PRINT TRACE
INFORMATION.
THE REASON THAT EVALHOOK IS BOUND BACK TO NIL BEFORE
CALLING THE HOOK FUNCTION IS BECAUSE THE HOOK FUNCTION
MAY BE INTERPRETED, AND WE WANT TO AVOID INFINITE
RECURSION. THERE IS A PROBLEM, THOUGH: HOW CAN THE
HOOK FUNCTION EVALUATE ITS ARGUMENT ONCE IT HAS
PRINTED STUFF OUT? IF IT JUST CALLS EVAL BACK AGAIN,
THEN THE VARIABLE EVALHOOK WILL BE NIL, AND THE
HOOK FUNCTION WILL NOT GET CALLED FOR THE RECURSIVE
CALLS ON EVAL. IF IT SETQ'S EVALHOOK TO THE HOOK
FUNCTION AND THEN CALLS EVAL, THE HOOK FUNCTION WILL
GET CALLED BACK WITH THE SAME THING.
FOR THIS REASON THERE IS AN EVALHOOK FUNCTION.
THE EVALHOOK FUNCTION CALLS EVAL WITH ITS FIRST
ARGUMENT, AFTER BINDING THE VARIABLE EVALHOOK TO
ITS LAST ARGUMENT, AND BYPASSING THE HOOK FUNCTION
CHECK IN EVAL.
IF THAT ALL WENT BY TOO FAST, TAKE A LOOK AT THESE
DEFINITIONS IN LISP:
(DECLARE (SPECIAL *RSET EVALHOOK))
(DEFUN EVAL N
(OR (= N 1) (= N 2)
(ERROR '|WRONG NUMBER OF ARGS TO LSUBR|
(CONS 'EVAL (LISTIFY N))
'WRNG-NO-ARGS))
(AND (= N 2)
(HACK-FAKE-ALIST (ARG 2)))
(COND ((AND EVALHOOK
*RSET
(SSTATUS-EVALHOOK-T-WAS-DONE-P))
((LAMBDA (EVALHOOK)
(FUNCALL EVALHOOK (ARG 1)))
NIL))
(T (+INTERNAL-EVAL (ARG 1)))))
(DEFUN EVALHOOK N
(OR (= N 2) (= N 3)
(ERROR '|WRONG NUMBER OF ARGS TO LSUBR|
(CONS 'EVALHOOK (LISTIFY N))
'WRNG-NO-ARGS))
(AND (= N 3) ;SECOND ARG OF 3 IS ALIST
(HACK-FAKE-ALIST (ARG 2)))
((LAMBDA (EVALHOOK)
(+INTERNAL-EVAL (ARG 1)))
(ARG N)))
THE REASON THAT BOTH (*RSET T) AND (SSTATUS EVALHOOK T)
MUST BE DONE IS FOR REASONS OF EFFICIENCY (SIGH).
HERE IS AN EXAMPLE OF THE USAGE OF EVALHOOK:
(DEFUN HOOK FEXPR (X) ;CALLED AS (HOOK <FORM>)
((LAMBDA (*RSET EVALHOOK)
(PROG2 (SSTATUS EVALHOOK T) ;MAGIC SSTATUS
(EVAL (CAR X)) ;EVALUATE FORM
(SSTATUS EVALHOOK NIL))) ;MORE MAGIC
T
'HOOK-FUNCTION)) ;THE HOOK FUNCTION
(DEFUN HOOK-FUNCTION (F)
(TERPRI) ;PRINT PRETTY MESSAGE FOR INPUT
(PRINC '|FORM: |)
(PRIN1 F)
((LAMBDA (V) ;V GETS VALUE OF FORM
(TERPRI) ;PRETTY OUTPUT MESSAGE
(PRINC '|VALUE: |)
(PRIN1 V))
(EVALHOOK F 'HOOK-FUNCTION))) ;THIS IS HOW TO EVAL THE FORM
; SO AS TO HOOK SUB-FORMS
THUS FOR SOMETHING LIKE (HOOK (CONS (CAR '(A . B)) 'C))
THE FOLLOWING OUTPUT MIGHT BE SEEN:
FORM: (CONS (CAR (QUOTE (A . B))) (QUOTE C))
FORM: (CAR (QUOTE (A . B)))
FORM: (QUOTE (A . B))
VALUE: (A . B)
FORM: (QUOTE C)
VALUE: C
VALUE: ((A . B) . C)
((A . B) . C)
NATURALLY, ONE CAN DREAM UP INFINITELY HAIRY THINGS
TO DO WITH THIS, SUCH AS INTERACTIVE TRACING AND BREAKING,
INDENTED OUTPUT, ETC.
[8] A NEW VERSION OF NEWIO IS OUT!
HERE FOLLOWS A COPY OF .INFO.;NEWIO STUFF, WHICH HAS
BEEN UPDATED TO ACCOUNT FOR ALL THE CHANGES MENTIONED
IN THE SYNOPSIS.
NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO NEWIO
----------------------------------------------------------------
THINGS OF NOTE NOT YET IMPLEMENTED:
----------------------------------------------------------------
[1] FILEPOS NOT YET IMPLEMENTED.
[2] ALLFILES NOT YET IMPLEMENTED.
[3] MOBY I/O DOES NOT YET WORK UNDER NEW I/O.
----------------------------------------------------------------
NEW FUNCTIONS:
----------------------------------------------------------------
(↑G) SIGNALS A ↑G QUIT; IT REPLACES (IOC G).
(IN <FILE>) READS IN A FIXNUM FROM A BINARY INPUT FILE AND
RETURNS IT. TO GET A BINARY FILE, SEE THE NEW
OPEN FUNCTION.
(OUT <FILE> <FIXNUM>) OUTPUTS THE FIXNUM TO THE BINARY
FILE AND RETURNS T.
(TRUENAME <FILE>) GIVES THE "TRUE NAME" OF THE FILE,
AS OPPOSED TO THE FILE NAMES USED TO OPEN IT.
THIS IS THE NAME FOUND AFTER TRANSLATIONS AND
LINKS, ETC. (IT IS THE NAME RETURNED BY A .RCHST
ON THE FILE'S CHANNEL.)
ECHOFILES IS A VARIABLE WHICH, IF NON-NIL, SHOULD BE A
LIST OF OUTPUT FILES. THESE OUTPUT FILES
RECEIVE EVERY CHARACTER SEEN AS INPUT BY TYI
(AND FUNCTIONS WHICH USE TYI, SUCH AS READ).
IF A FILE IS A MEMBER OF BOTH THE ECHOFILES
AND OUTFILES LISTS, IT WILL BE A "DRIBBLE
FILE", RECORDING BOTH INPUT AND OUTPUT.
NOTE THAT THE FUNCTION WHICH PRE-SCANS TTY INPUT
AND PERFORMS RUBOUT PROCESSING LAMBDA-BINDS
ECHOFILES TO NIL, SO YOU WON'T SEE RUBBED-OUT
CHARACTERS.
(OPEN <FILE> <MODELIST>) OPENS A FILE AND RETURNS A
CORRESPONDING FILE OBJECT. IT IS ACTUALLY AN LSUBR
OF ZERO TO TWO ARGUMENTS. THE <FILE> DEFAULTS TO THE
CURRENT DEFAULT FILE NAMES. THE <MODELIST> DEFAULTS
TO NIL.
IF <FILE> IS A NAMELIST OR NAMESTRING, A NEW FILE ARRAY
IS CREATED. IF <FILE> IS A FILE ARRAY ALREADY, IT IS
CLOSED AND RE-OPENED IN THE SPECIFIED MODE; ITS FORMER
MODES SERVE AS THE DEFAULTS FOR THE <MODELIST>.
THE <MODELIST> DETERMINES A LARGE NUMBER OF ATTRIBUTES
FOR OPENING THE FILE. FOR EACH ATTRIBUTE THERE ARE
TWO OR MORE MUTUALLY EXCLUSIVE VALUES WHICH MAY BE
SPECIFIED AS FOLLOWS. VALUES MARKED BY A * ARE THOSE
USED AS DEFAULTS WHEN THE <FILE> IS A NAMELIST OR
NAMESTRING. IF THE <MODELIST> IS AN ATOM, IT IS THE
SAME AS SPECIFYING THE LIST OF THAT ONE ATOM.
DIRECTION:
* IN INPUT FILE
* READ SAME AS "IN"
OUT OUTPUT FILE
PRINT SAME AS "OUT"
APPEND OUTPUT, APPENDED TO EXISTING FILE
DATA MODE:
* ASCII FILE IS A STREAM OF ASCII CHARACTERS.
SYSTEM-DEPENDENT TRANSFORMATIONS MAY
OCCUR, SUCH AS SUPPLYING LF AFTER CR,
OR BEING CAREFUL WITH OUTPUT OF ↑P,
OR MULTICS ESCAPE CONVENTIONS.
FIXNUM FILE IS A STREAM OF FIXNUMS. THIS
IS FOR DEALING WITH FILES THOUGHT OF
AS "BINARY" RATHER THAN "CHARACTER".
IMAGE FILE IS A STREAM OF ASCII CHARACTERS.
ABSOLUTELY NO TRANSFORMATIONS ARE MADE.
DEVICE TYPE:
* DSK STANDARD KIND OF FILE.
TTY CONSOLE. IN PARTICULAR, ONLY TTY INPUT
FILES HAVE INTERRUPT CHARACTER FUNCTIONS
ASSOCIATED WITH THEM.
BUFFERING MODE:
* BLOCK DATA IS BUFFERED.
SINGLE DATA IS UNBUFFERED.
IF THE DEVICE TYPE IS TTY, THE DEFAULT IS
SINGLE INSTEAD OF BLOCK ON ITS.
ECHO MODE:
ECHO OPENS OUTPUT TTY IN ECHO AREA (ITS ONLY).
SOME OF THESE VALUES ARE OF COURSE SYSTEM-DEPENDENT.
YOUR LOCAL LISP SYSTEM WILL ATTEMPT TO DO THE RIGHT
THING, HOWEVER, IN ANY CASE.
IF THE OPTIONS LIST IS INVALID IN ANY WAY, OPEN MAY EITHER
GIVE A WRNG-TYPE-ARGS ERROR, OR BLITHELY ASSUME A
CORRECTED VALUE FOR AN ATTRIBUTE. IN GENERAL, ERRORS
SHOULD OCCUR ONLY FOR TRULY CONFLICTING SPECIFICATIONS.
ON THE OTHER HAND, SPECIFYING BLOCK MODE FOR A DEVICE
THAT THE SYSTEM WANTS TO HANDLE ONLY IN CHARACTER MODE
MAY JUST GO AHEAD AND USE CHARACTER MODE.
(OPENI X) == (OPEN X 'READ)
(OPENO X) == (OPEN X 'PRINT)
(OPENA X) == (OPEN X 'APPEND)
(RUBOUT <CHAR> <FILE>) ATTEMPTS TO RUB OUT ONE CHARACTER.
<CHAR> SHOULD BE A FIXNUM BETWEEN 0 AND 177 (AN ASCII VALUE).
<FILE> SHOULD BE A TTY OUTPUT FILE; IF OMITTED, T IS ASSUMED.
IF IT IS NOT POSSIBLE TO RUB OUT THE CHARACTER CORRECTLY,
RUBOUT WILL RETURN NIL INSTEAD OF T; IT IS UP TO THE CALLER
TO DO SOMETHING ABOUT THIS CASE. CHARACTERS WHICH CANNOT
CORRECTLY BE RUBBED OUT INCLUDE TAB AND CARRIAGE RETURN.
IF THE OUTPUT TTY CAN DO CURSOR POSITIONING AND SELECTIVE
RASURE, THEN THE CHARACTER IS RUBBED OUT BY ERASING IT
FROM THE SCREEN AND BACKING UP THE CURSOR; OTHERWISE, THE
CHARACTER IS PRINTED ON THE TTY (RUBOUT ECHO).
(SSTATUS TTYSCAN <FUNCTION> <FILE>) SETS UP A TTY PRE-SCAN
FUNCTION FOR <FILE>, WHICH MUST BE A TTY INPUT FILE.
IF <FILE> IS OMITTED, T IS ASSUMED.
THE <FUNCTION> SHOULD ACCEPT THREE ARGUMENTS:
(1) THE FILE TO DO PRE-SCANNING FOR.
(2) THE INPUT FUNCTION TO PRE-SCAN FOR.
POSSIBILITIES ARE READ, TYI, READLINE,
EDIT, AND PERHAPS OTHERS.
(3) THE NUMBER OF HANGING LEFT PARENTHESES, AS
A FIXNUM (MEANINGFUL ONLY IF ARGUMENT 2
IS 'READ).
IT IS THE RESPONSIBILITY OF THE PRE-SCAN FUNCTION TO
READ IN SOME CHARACTERS FROM THE FILE HANDED TO IT AS
ITS FIRST ARGUMENT, AND TO RETURN A LIST OF FIXNUMS
BETWEEN 0 AND 177 OCTAL. TYPICALLY THE PRE-SCAN FUNCTION
WILL PROVIDE FOR RUBOUT PROCESSING, ETC.
IF THE PRE-SCAN FUNCTION RETURNS NIL, AN END-OF-FILE
WILL BE SIGNALED FOR THE TTY INPUT FILE. THIS IS A WAY
TO SIGNAL OVER-RUBOUT.
(THE INITIAL LISP SYSTEM PROVIDES FOR THE INITIAL TTY INPUT
FILE A PRE-SCAN FUNCTION WHICH DOES STANDARD RUBOUT PROCESSING.)
(STATUS TTYSCAN <FILE>) NATURALLY RETURNS THE PRE-SCAN
FUNCTION FOR <FILE> (T IF <FILE> IS OMITTED).
----------------------------------------------------------------
THINGS WHICH HAVE CHANGED FROM OLD I/O AND NOT IN THE MANUAL:
----------------------------------------------------------------
IN NEW I/O FILES ARE SPECIFIED BY MEANS OF NAMESTRINGS AND
NAMELISTS AS DOCUMENTED IN THE MANUAL.
THERE IS FURTHERMORE A COMPATIBILITY FEATURE WHICH ALLOWS
OLD I/O 4-LISTS TO BE USED INTERCHANGEABLY WITH NEW I/O
NAMELISTS. IF THE CAR OF A PUTATIVE NAMELIST IS ATOMIC,
THEN IT IS ASSUMED TO BE AN OLD I/O 4-LIST.
FINALLY, NEW I/O ON THE PDP-10 KNOWS MOST STANDARD DEVICE
NAMES; IF IT SEES A NAME WHERE A DEVICE BELONGS, AND IT IS
NOT ONE OF THE STANDARD DEVICE NAMES, AND NO SNAME WAS
SUPPLIED, THEN THE NAME IS TAKEN TO BE THE SNAME, AND *
IS SUPPLIED FOR THE DEVICE.
ALL THESE COMPATIBILITY FEATURES ARE FOR THE PDP-10 ONLY!
EXAMPLES:
THESE ARE ALL EQUIVALENT AS FILE NAMES:
(FOO BAR * GLS)
(FOO BAR GLS)
((GLS) FOO BAR)
((* GLS) FOO BAR)
THE ARGUMENT TO AN OLD I/O FUNCTION IS ONE OF THESE LISTS;
THUS ONE MAY SAY EQUIVALENTLY:
(UREAD FOO > * GLS)
(UREAD FOO > DSK GLS) ;IF YOUR DEFAULT DEV IS DSK:
(UREAD FOO) ;IF YOUR DEFAULT IS DSK:GLS;
; BECAUSE UREAD SUPPLIES >
(UREAD (GLS) FOO) ;IF YOUR DEFAULT DEV IS DSK:
(UREAD (DSK GLS) FOO)
(UREAD (DSK GLS) FOO >)
HERE ARE DEFINITIONS OF THE OLD I/O FUNCTIONS IN TERMS OF THE
NEW ONES. THEY MAY BE TAKEN QUITE LITERALLY.
(DEFUN UREAD FEXPR (FILENAME)
(UCLOSE)
((LAMBDA (FILE)
(EOFFN FILE
(FUNCTION
(LAMBDA (EOFFILE EOFVAL)
(SETQ UREAD NIL))))
(INPUSH (SETQ UREAD FILE))
(CAR (DEFAULTF FILE)))
(OPEN (*UGREAT FILENAME) 'IN)))
(DEFUN UCLOSE FEXPR (X)
(COND (UREAD
(AND (EQ UREAD INFILE) (INPUSH -1))
(CLOSE (PROG2 NIL UREAD (SETQ UREAD NIL))))
(T NIL)))
(DEFUN UWRITE FEXPR (DEVDIR)
(OR DEVDIR (SETQ DEVDIR (CAR (DEFAULTF NIL))))
(*UWRITE (CONS DEVDIR (COND ((STATUS FEATURE DEC10)
(CONS (STATUS JNAME) '(OUT)))
((STATUS FEATURE ITS)
'(.LISP. OUTPUT))))
'OUT
(LIST DEVDIR)))
(DEFUN UAPPEND FEXPR (FILENAME)
(PROG2 (SETQ FILENAME (*UGREAT FILENAME))
(*UWRITE FILENAME 'APPEND FILENAME)
(RENAME UWRITE
(COND ((STATUS FEATURE DEC10)
(CONS (STATUS JNAME) '(OUT)))
((STATUS FEATURE ITS)
'(/.LISP/. APPEND))))))
(DEFUN *UWRITE (NAME MODE NEWDEFAULT) ;INTERNAL ROUTINE
(COND (UWRITE
(SETQ OUTFILES (DELQ UWRITE OUTFILES))
(CLOSE UWRITE)
(SETQ UWRITE NIL)))
((LAMBDA (FILE)
(SETQ OUTFILES
(CONS (SETQ UWRITE FILE)
OUTFILES))
(CAR (DEFAULTF NEWDEFAULT)))
(OPEN NAME MODE)))
(DEFUN UFILE FEXPR (SHORTNAME)
(COND ((NULL UWRITE)
(ERROR 'NO/ UWRITE/ FILE
(CONS 'UFILE SHORTNAME)
'IO-LOSSAGE))
(T (PROG2 NIL
(CAR (DEFAULTF (RENAME UWRITE
(*UGREAT SHORTNAME))))
(SETQ OUTFILES (DELQ UWRITE OUTFILES))
(CLOSE UWRITE)
(SETQ UWRITE NIL)))))
(DEFUN CRUNIT FEXPR (DEVDIR)
(CAR (DEFAULTF (AND DEVDIR (LIST DEVDIR)))))
(DEFUN *UGREAT (NAME) ;INTERNAL ROUTINE
(MERGEF (MERGEF NAME
(COND ((STATUS FEATURE DEC10)
'(* . LSP))
((STATUS FEATURE ITS)
'(* . >))))
NIL))
(DEFUN UPROBE FEXPR (FILENAME)
(SETQ FILENAME (MERGEF (*UGREAT FILENAME) NIL))
(AND (PROBEF FILENAME) FILENAME))
(DEFUN UKILL FEXPR (FILENAME)
(DEFAULTF (DELETEF FILENAME))))
CURSORPOS MAY TAKE AN EXTRA ARGUMENT TO DETERMINE WHICH OUTPUT
TTY TO DO THE CURSOR POSITIONING ON. IF THE LAST ARGUMENT CAN
BE TAKEN TO BE A TTY, IT IS.
ONE INCOMPATIBILITY IS THAT (CURSORPOS 'T) NOW MEANS GET THE
COORDINATES OF TTY "T" RATHER THAN GO TO THE TOP OF THE SCREEN.
TO GO TO THE TOP OF THE SCREEN FOR THE DEFAULT TTY, USE
(CURSORPOS 'TOP) OR (CURSORPOS 124) OR (CURSORPOS 'T T).
LISTEN SIMILARLY TAKES AN OPTIONAL ARGUMENT TELLING WHICH INPUT
TTY TO LISTEN TO. NOTE THAT (LISTEN T) IS NOT QUITE THE SAME
AS (LISTEN); THE LATTER MERELY RETURNS THE RESULT OF A .LISTEN,
WHILE THE FORMER ACCOUNTS FOR BUFFERED-UP CHARACTERS WITHIN LISP.
TYIPEEK NOW TAKES UP TO THREE ARGUMENTS.
THE FIRST ARGUMENT IS AS IN OLD I/O; IT SPECIFIES THE KIND
OF PEEKING. A FIRST ARGUMENT OF NIL IS THE SAME AS NO ARGUMENT
AT ALL, EXCEPT THAT YOU NEED IT TO GET IN THE OTHER TWO
ARGUMENTS. THESE EXTRA ARGUMENTS ARE AS FOR READ, NAMELY
A FILE AND/OR EOF VALUE (WHICH SHOULD BE A FIXNUM).
AN INCOMPATIBLE CHANGE IS THAT TYIPEEK BY DEFAULT RETURNS
-1 INSTEAD OF 3 AT END OF FILE AND NEWIO.
(STATUS FILEMODE <FILE>) RETURNS A DOTTED PAIR WHOSE CAR
IS A LIST OF VALID OPTIONS TO THE OPEN FUNCTION, DESCRIBING
THE ATTRIBUTES OF THE FILE, AND WHOSE CDR IS A LIST OF
SEMI-SYSTEM-DEPENDENT SYMBOLS DESCRIBING ATTRIBUTES WHICH CANNOT
BE FED TO OPEN. AMONG THESE ATTRIBUTES ARE:
RUBOUT THIS TTY CAN SELECTIVELY ERASE.
SAIL THIS TTY HAS THE SAIL CHARACTER SET.
CURSORPOS THIS TTY CAN DO CURSOR POSITIONING.
(SSTATUS TTYCONS <TTY1> <TTY2>) EFFECTIVELY BINDS TWO TTY
FILES INTO A SINGLE CONSOLE. ONE OF THE TTY'S SHOULD BE AN
INPUT TTY, AND THE OTHER AN OUTPUT TTY. INITIALLY THE
SYSTEM PERFORMS (SSTATUS TTYCONS T T) FOR YOU.
(STATUS TTYCONS <TTY>) RETURNS THE TTY WHICH THE ONE YOU
SPECIFIED IS LINKED TO, OR NIL IF IT ISN'T LINKED.
THIS IS USEFUL, FOR EXAMPLE, IN A **MORE** INTERRUPT,
TO DETERMINE WHICH INPUT TTY TO READ THE CHARACTER FROM.
(STATUS TTYINT <CHAR> <INPUT TTY>)
(SSTATUS TTYINT <CHAR> <FUNCTION> <INPUT TTY>)
THESE STATUS FUNCTION ARE USED TO SET UP AND EXAMINE
INTERRUPT CHARACTER FUNCTIONS FOR TTY INPUT FILES.
IF <FILE> IS OMITTED, T (THE STANDARD TTY) IS ASSUMED.
<CHAR> SHOULD BE EITHER A NUMERIC ASCII VALUE, OR
A SINGLE CHARACTER OBJECT. NOTE THAT <CHAR> IS ALWAYS
EVALUATED, UNLIKE (STATUS CHTRAN), FOR EXAMPLE.
<FUNCTION> SHOULD BE EITHER A FUNCTION OF TWO ARGUMENTS
OR A FIXNUM. IF IT IS A FUNCTION, THEN WHEN THE INTERRUPT
OCCURS IT RECEIVES AS ARGUMENTS THE FILE ON WHICH THE
INTERRUPT OCCURRED, AND THE CHARACTER TYPED, AS A FIXNUM.
IF THE FUNCTION IS A FIXNUM, IT REPRESENTS THE INTERNAL
SYSTEMIC INTERRUPT INITIALLY ASSOCIATED WITH THAT CHARACTER.
THUS, FOR EXAMPLE:
(SSTATUS TTYINT 7
'(LAMBDA (F CH) (PRINC '|WHY DID YOU TYPE ↑G? |)))
(SSTATUS TTYINT 6 7)
WILL CAUSE ↑F T DO A "↑G QUIT", AND ↑G MERELY TO PRINT THE
MESSAGE "WHY DID YOU TYPE ↑G? ".
NOTE THAT AN INTERRUPT CAN BE ASSOCIATED WITH ANY ASCII
CHARACTER, NOT JUST CONTROL CHARACTERS. (FOR A FRUSTRATING
EXPERIENCE, SET ")" TO BE A "↑G QUIT".) ON ITS, HOWEVER,
ONE MUST USE (SSTATUS TTY) TO TELL ITS THAT THINGS LIKE
"?" OR "#" ARE TO BE CONSIDERED INTERRUPT CHARACTERS
(THIS IS SIMILAR TO THE ACTIVATION CHARACTER PROBLEM).
THE MEANINGFUL SYSTEMIC INTERRUPT VALUES ARE:
OCTAL VALUE CHAR WHAT IT DOES
3 ↑C (SETQ ↑D NIL)
4 ↑D (SETQ ↑D T)
7 ↑G ↑G QUIT
22 ↑R (SETQ ↑R T)
24 ↑T (SETQ ↑R NIL)
26 ↑V (SETQ ↑W NIL)
27 ↑W (SETQ ↑W T)
30 ↑X ↑X QUIT
32 ↑Z RETURN TO DDT
THE DIFFERENCE BETWEEN (SSTATUS TTYINT 1 4) AND
(SSTATUS TTYINT 1 '(LAMBDA (F CH) (SETQ ↑D T)))
IS THAT THE FORMER WILL LET THE INTERRUPT HAPPEN AND
TAKE EFFECT EVEN IF IN A PLACE WHERE A GENERAL USER
FUNCTION MAY NOT BE RUN, E.G. IN THE MIDDLE OF A GARBAGE
COLLECTION.
NOTE THAT INITIALLY ↑S IS SET TO BE LIKE ↑W AS AN
INTERRUPT CHARACTER (SEE BELOW).
↑Q IS NO LONGER INITIALLY AN INTERRUPT CHARACTER,
BUT A SPLICING MACRO AND FORCE-FEED WHOSE DEFINITION
IS (LAMBDA NIL (SETQ ↑Q T) NIL). THIS HAS THE SAME
EFFECT WHEN TYPED AT THE KEYBOARD AS BEFORE, BUT
PREVENTS CERTAIN TIMING SCREWS.
↑S NO LONGER DOES (SETQ ↑Q NIL). INSTEAD, IT IS THE
SAME AS ↑W AS AN INTERRUPT CHARACTER. UNLIKE ↑W,
IT IS ALSO A SPLICING MACRO AND FORCE-FEED, WITH THE
DEFINITION (LAMBDA NIL (SETQ ↑W NIL) (TERPRI) NIL).
THUS IF A LONG PRINTOUT IS COMING AT YOU, JUST TYPE
↑S AND YOU WILL SEE A TERPRI WHEN CONTROL RETURNS TO
THE KEYBOARD. THIS IS LIKE ↑S IN DDT, AND REPLACES
THE OLD TRICK OF TYPING ↑W AND THEN (IOC V).
↑Z NO LONGER DOES A :VK TO DDT.
↑U NO LONGER RELEASES THE PAGEPAUSE (WHICH IS ALSO GONE).
↑B AND ↑E DO NOT TOGGLE LPT OUTPUT.
LOSERS CAN PROGRAM THIS FOR THEMSELVES.
SEE ML:GLS;NIFTY QIO.
↑H IS ALPHABETIC IN NEW I/O, FOR COMPATIBILITY WITH
MULTICS, AND SO YOU CAN UNDERLINE NAMES. BEWARE!
A<BACKSPACE>← IS NOT THE SAME ATOM AS ←<BACKSPACE>A.
(THERE WILL EVENTUALLY BE A USER-PROGRAMMABLE
SOLUTION TO THIS "BUG" - A LINE CANONICALIZER.)
↑B IN NEW I/O GIVES A "↑B BREAK", WHICH IS THE SAME AS
THE "↑H BREAK" OF OLD I/O.
FOR TTY OUTPUT FILES ON ITS, THE ENDPAGEFN IS NOT TRIPPED WHEN
THE LINENUM EXCEEDS PAGEL. RATHER, THE **MORE** INTERRUPT
IS USED, WHICH IS MORE ACCURATE FOR DETECING THE BOTTOM OF
THE SCREEN. WHEN THE TTY REACHES THE BOTTOM OF THE SCREEN,
THE ENDPAGEFN FOR THE TTY IS INVOKED; IT RECEIVES AS ARGUMENT
THE FILE ON WHICH THE INTERRUPT OCCURRED.
HERE ARE SOME NEAT FUNCTIONS FOR USING THE **MORE** FEATURE
(THEY LIVE IN ML:GLS;NIFTY QIO):
(DECLARE (SPECIAL **MORE** MORE-FLUSH))
(SETQ **MORE** '##MORE##)
(SETQ MORE-FLUSH NIL)
;;; TTY-ENDPAGEFN IS AN ENDPAGEFN FOR THE TTY FOR PROCESSING
;;; **MORE** INTERRUPTS. WHAT IT DOES DEPENDS ON TWO
;;; GLOBAL VARIABLES (BOUND BY THE CATCHMORE MACRO):
;;; **MORE** MORE-FLUSH ACTION
;;; NIL NIL NOTHING
;;; NON-NIL NIL "DUMB" MORE PROCESSING;
;;; I.E. PRINT THE VALUE
;;; OF **MORE** AND WAIT FOR
;;; THE LOSER TO TYPE SOMETHING,
;;; BUT NO PROVISION FOR FLUSHING
;;; NIL NON-NIL FLUSH IMMEDIATELY BY DOING
;;; (THROW NIL CLEVER-MORE).
;;; THIS IS GOOD FOR PRINTING
;;; EXACTLY ENOUGH TO FILL A SCREEN.
;;; NON-NIL NON-NIL "SMART" MORE PROCESSING;
;;; I.E. PRINC THE VALUE OF
;;; **MORE** AND WAIT FOR A
;;; CHARACTER. IF SPACE OR
;;; RUBOUT, GOBBLE IT. IF IT
;;; WAS SPACE, JUST RETURN;
;;; OTHERWISE FLUSH BY PRINC'ING
;;; MORE-FLUSH AND DOING
;;; (THROW NIL CLEVER-MORE).
(DEFUN TTY-ENDPAGEFN (FILE)
(COND (**MORE** (PRINC **MORE**)
((LAMBDA (IFILE)
((LAMBDA (CH)
(AND (OR (= CH 40)
(= CH 177))
(TYI IFILE))
(COND ((AND MORE-FLUSH
(NOT (= CH 40)))
(PRINC MORE-FLUSH)
(THROW NIL CLEVER-MORE))
(T (CURSORPOS NIL 0 FILE)
(CURSORPOS 'L FILE)
(CURSORPOS 'T FILE))))
(TYIPEEK NIL IFILE)))
(OR (STATUS TTYCONS FILE) T)))
(MORE-FLUSH (THROW NIL CLEVER-MORE))))
(ENDPAGEFN T 'TTY-ENDPAGEFN)
;;; (CATCHMORE X Y Z) EVALUATES Z WITH A **MORE** CATCH
;;; AROUND IT. THIS COOPERATES WITH TTY-ENDPAGEFN
;;; TO DO **MORE** PROCESSING.
;;; THUS, FOR EXAMPLE, (CATCHMORE '**MORE** 'FLUSHED <STUFF>)
;;; WHERE <STUFF> DOES SOME PRINTING WILL PERFORM THE
;;; STANDARD KIND OF **MORE** PROCESSING, FLUSHING <STUFF>
;;; IF A NON-SPACE IS TYPED.
;;; THE MACRODEF MACRO-DEFINER LIVES IN ML:GLS;MACROS >.
(MACRODEF CATCHMORE (MOREMSG FLUSHMSG . BODY)
(CATCH ((LAMBDA (**MORE** MORE-FLUSH) . BODY)
MOREMSG FLUSHMSG)
CLEVER-MORE))
(DEFUN DIR FEXPR (X) ;LIST AN ITS FILE DIRECTORY
(TERPRI)
(CURSORPOS 'C)
((LAMBDA (FILE)
(CATCHMORE '|---TYPE SPACE FOR MORE---|
'|OH, WELL, SO MUCH FOR THAT...|
(DO ((CH (TYI FILE) (TYI FILE)))
((= CH 14))
(TYO CH)))
(CLOSE FILE))
(OPEN (CONS (CONS 'DSK X) '(/.FILE/. /(DIR/)))))
(ASCII 0))
FASLOADING WITHIN A FASLOAD WORKS PRETTY WELL.
NATURALLY, YOU CAN ONLY FASLOAD *BETWEEN* FUNCTION;
"EVALUATED CONSTANTS" WITHIN A FUNCTION MAY NOT
DO FASLOADS. (IF YOU DON'T UNDERSTAND THIS LAST ITEM,
DON'T WORRY.)
FORCE-OUTPUT IS AS IN THE MANUAL; IT FORCES AN BUFFER OUT.
CLEAR-INPUT AND CLEAR-OUTPUT BOTH EXIST. ON ITS THEY ARE
MEANINGFUL ONLY FOR TTY FILES, THOUGH THEY DON'T HURT ON
ANY OTHER FILES.
THE STATUS CALLS BELOW ARE EQUIVALENT TO THE
EXPRESSIONS TO THE RIGHT, AND ARE INCLUDED ONLY
FOR COMPATIBILITY WITH OLD I/O. AVOID USING THESE
STATUS CALLS IN NEW CODE.
NOTE THAT (STATUS UREAD) ETC. RETURNS A NEW I/O NAMELIST,
WHICH IS NOT QUITE OF THE SAME FORM AS AN OLD I/O 4-LIST.
(STATUS UREAD) <=> (TRUENAME UREAD)
(SSTATUS UREAD ...) <=> (UREAD ...)
(STATUS UWRITE) <=> (CAR (TRUENAME UWRITE))
(SSTATUS UWRITE ...) <=> (UWRITE ...)
(STATUS CRFILE) <=> (CDR (DEFAULTF NIL))
(SSTATUS CRFILE ...) <=> (DEFAULTF '(...))
(STATUS CRUNIT) <=> (CRUNIT NIL)
(SSTATUS CRUNIT ...) <=> (CRUNIT ...)
FOR COMPATIBILITY WITH OLD I/O, IF THE FILE IS OMITTED
IN THE STATUS CALLS BELOW, THE VALUE T (THE STANDARD
INITIAL TTY) IS ASSUMED.
(STATUS TTY X) HANDS BACK THE TTYST1, TTYST2, AND TTYSTS
VARIABLES FOR THE TTY INPUT FILE X AS A LIST
OF THREE FIXNUMS.
(SSTATUS TTY M N X) SETS THE TTYST1 AND TTYST2 VARIABLES
FOR THE TTY INPUT FILE X TO THE FIXNUMS M AND N.
(STATUS TTYREAD X) HANDS BACK THE TTYREAD SWITCH FOR THE
TTY INPUT FILE X. IF NIL, THEN ONLY FORCE-FEED
CHARACTERS CAUSE THE TTY PRE-SCAN FUNCTION TO
RETURN WITH ITS BUFFERED LIST OF CHARACTERS.
(SSTATUS TTYREAD VAL X) SETS THE SWITCH TO T OR NIL
ACCORDING TO VAL.
(STATUS LINMODE X) HANDS BACK THE LINMODE SWITCH FOR THE
TTY INPUT FILE X. IF T, THEN ONLY CARRIAGE
RETURNS CAUSE THE TTY PRE-SCAN FUNCTION TO
RETURN WITH ITS BUFFERED LIST OF CHARACTERS.
(SSTATUS LINMODE VAL X) SETS THE LINMODE SWITCH.
IT ALSO AFFECTS THE ACTIVATION BITS IN
THE TTYST1 AND TTYST2 VARIABLES.
----------------------------------------------------------------
THINGS WHICH HAVE DISAPPEARED IN NEW I/O, NOT TO BE IMPLEMENTED
----------------------------------------------------------------
(STATUS INTERRUPT) AND (SSTATUS INTERRUPT) DO NOT EXIST
IN NEWIO. (ENDPAGEFN <FILE> <FUNCTION>) IS USED TO SET UP
**MORE** INTERRUPTS; (SSTATUS TTYINT) IS USED TO SET FUNCTIONS
FOR INTERRUPT CHARACTERS. ALL OTHER INTERRUPT FUNCTIONS
ARE THE VALUES OF ATOMIC SYMBOLS, AND SO CAN BE SET UP
WITH SETQ. THE NAMES OF THESE VARIABLES ARE:
ALARMCLOCK UNDF-FNCTN
AUTOLOAD UNBND-VRBL
ERRSET WRNG-TYPE-ARG
*RSET-TRAP UNSEEN-GO-TAG
GC-DAEMON WRNG-NO-ARGS
GC-OVERFLOW GC-LOSSAGE
PDL-OVERFLOW FAIL-ACT
IO-LOSSAGE
THE ONLY ONE OF THESE WHICH IS NEW IN NEWIO IS AUTOLOAD,
WHICH HOLDS THE AUTOLOAD INTERRUPT HANDLER.
LOADARRAYS AND DUMPARRAYS NO LONGER EXIST. A MORE GENERAL
NEW I/O PRIMITIVE WILL EVENTUALLY ENABLE THE USER TO WRITE
THESE FUNCTIONS FOR HIMSELF (A STANDARD PACKAGE EQUIVALENT
TO THE OLD ONES WILL BE PROVIDED).
IOC NO LONGER EXISTS IN NEW I/O. USE THE FOLLOWING
TABLE OF EQUIVALENCES:
(IOC C) <=> (SETQ ↑D NIL)
(IOC D) <=> (SETQ ↑D T)
(IOC G) <=> (↑G)
(IOC Q) <=> (SETQ ↑Q T)
(IOC R) <=> (SETQ ↑R T)
(IOC S) <=> (SETQ ↑Q NIL)
(IOC T) <=> (SETQ ↑R NIL)
(IOC V) <=> (SETQ ↑W NIL)
(IOC W) <=> (CLEAR-OUTPUT (SETQ ↑W T))
(IOC X) <=> (↑X)
(IOC Z) <=> (VALRET ':VK/ )
TO INVOKE USER INTERRUPT FUNCTIONS, JUST FUNCALL THEM.
IOG NO LONGER EXISTS. INSTEAD OF (IOG NIL ...) SAY INSTEAD
((LAMBDA (↑Q ↑R ↑W) ...) NIL NIL NIL).
(STATUS IOC), (SSTATUS IOC) NO LONGER EXIST.
THEIR EFFECT CAN BE DUPLICATED BY USING
SETQ, FUNCALL, OR THE NEW ↑X AND ↑G
FUNCTIONS.
(STATUS TERPRI), (SSTATUS TERPRI) NO LONGER EXIST.
TO GET THEIR EFFECT, USE THE LINEL FUNCTION
TO SET THE LINEL FOR EACH OUTPUT FILE TO 0.
(A LINEL OF ZERO MEANS INFINITY.)
(STATUS PAGEPAUSE), (SSTATUS PAGEPAUSE) NO LONGER EXIST.
THEY HAVE BEEN SUPERSEDED BY THE **MORE**
INTERRUPT FEATURE.
2/7/75 - JONL AND GLS -
BRIEF SYNOPSIS:
[1] THE VALUE OF PRIN1 CONTROLS USE OF PRIN1 BY LISP.
[2] NEW COMPLR SWITCHES, AND DECLARATIONS, AND THINGS:
[2A] ↑↑ NOW ENTERS MAKLAP.
[2B] COMPILER-STATE TO DETERMINE STATE OF COMPILER.
[2C] EXPR-HASH (E SWITCH) FOR FUNCTION HASHING.
[2D] THE GLOBAL VARIABLE "SOBARRAY" HOLDS THE ARRAY POINTER
TO THE STANDARD LISP OBARRAY.
[2E] EOC-EVAL TO EVAL THINGS AFTER COMPILATION IS COMPLETED.
[2F] COUTPUT TO OUTPUT THINGS TO THE LAP FILE.
[2G] DONT EVER, BUT EVER, USER "QUOTE" AS A LAMBDA OR
PROG VARIABLE.
[3] VALUE OF DEFUN CONTROLS EXPR-HASH CROCK IN INTERPRETER.
[4] USE PLIST AND SETPLIST TO ACCESS AND STORE PROPERTY LISTS
[5] "ROMAN" APPEARS ON THE FEATURE LIST [GOTTEN BY (STATUS FEATURES),
OR TESTED BY (STATUS FEATURE ROMAN)] IF THAT HACK IS ASSEMBLED IN.
[6] ON A DEC-10 MONITOR, (STATUS JNAME) RETURNS "NNNLSP".
[7] ← FIXNUM OUTPUT FORMAT EXTENDED TO ←22, ←11.
[8] (STATUS FREE ...), (SSTATUS FREE ...) FLUSHED.
[9] MANY CHANGES TO THE BREAK AND *BREAK FUNCTIONS:
[4A] BREAK OF THREE ARGUMENTS NO LONGER EXISTS.
[4B] BREAK/*BREAK LAMBDA-BIND *, +, -.
[4C] ([S]STATUS BREAKLEVEL) IS LIKE ([S]STATUS TOPLEVEL).
[4D] BREAK USES A CATCH; (THROW <VALUE> BREAK) EXITS.
ALSO, AN ATTEMPT TO EXPLAIN BREAK AND TOPLEVEL IN EXPR CODE
----------------------------------------------------------------
[1] THE VALUE OF THE ATOM "PRIN1" NOW CONTROLS THE ACTION OF
PRINTING BY THE TOP-LEVEL AND BREAK ROUTINES. IN SHORT, AN
ITEM X RESULTING FROM THE EVALUATION IN THESE LOOPS IS
PRINTED LIKE
(COND (PRIN1 (FUNCALL PRIN1 X))
(T (PRIN1 X)))
THIS FEATURE EXISTS PRIMARILY FOR THE OWL SYSTEM, WHICH HAS
CIRCULAR LIST STRUCTURE ABUNDANT, AND DOESN'T NEED TO
REWRITE THE ENTIRE TOP-LEVEL ROUTINE MERELY TO ACCOUNT FOR
THE PRINTING OF CIRCULAR STRUCTURE.
[2] SOME NEW SWITCHES AND DECLARATIONS FOR THE COMPILER:
[2A] TYPING ↑↑ NOW ENTERS MAKLAP [JUST AS IN MACSYMA, WHERE ↑↑
DOES A (CONTINUE)].
[2B] COMPILER-STATE
THIS VARIABLE REVEALS TO THE USER ONE OF THREE STATES
THAT THE COMPILER MAY BE IN, AND IS OF INTEREST TO
SOMEONE WHO WANTS TO WRITE SOPHISTICATED MACROS WHICH
EXPAND IN DIFFERENT WAYS DEPENDING ON THE REASON FOR
THE EXPANSION. POSSIBLE VALUES FOR COMPILER-STATE:
[2B1] "TOPLEVEL"
THE COMPILER IS AT THE TOP LEVEL OF LISP.
[2B2] "MAKLAP"
THE COMPILER IS SCANNING AN INPUT FILE LOOKING
FOR FUNCTION DEFINITIONS TO COMPILE. IN THIS
STATE THE COMPILER WILL EXPAND ANY TOP-LEVEL
FORM (FOO ...) FOR WHICH FOO HAS A MACRO
PROPERTY TO SEE IF A FUNCTION DEFINITION IS
PRODUCED [WHICH WOULD THEN BE COMPILED].
[2B3] "COMPILE"
THE COMPILER IS ACTUALLY COMPILING A FORM
WHICH IS A FUNCTION DEFINITION, PRODUCING
LAP CODE. IN THIS STATE ANY SUB-FORM
(FOO ...) WHICH IS TO BE COMPILED IS EXPANDED
IF FOO HAS A MACRO PROPERTY.
RANDOM EXAMPLE:
WHEN A FUNCTION IS DEFINED YOU WANT THE FLATSIZE OF
THE DEFINITION TO BE PUT ON THE PROPERTY LIST OF
THE FUNCTION. IF THE FUNCTION IS COMPILED, YOU WANT
TO ARRANGE TO OUTPUT AN APPROPRIATE DEFPROP INTO
THE LAP FILE.
(DEFUN STRANGE-DEFUN MACRO (FORM)
;DO THE MACRO THING (NOT HAIRY)
(RPLACA FORM 'DEFUN)
;NOW HACK THE FLATSIZE THING
(COND ((OR (NULL (BOUNDP COMPILER-STATE))
(EQ COMPILER-STATE 'TOPLEVEL))
;IF INTERPRETING, OR AT COMPILER TOPLEVEL,
; JUST GO AHEAD AND DO THE PUTPROP
(PUTPROP (CADR FORM)
(FLATSIZE FORM)
'STRANGE-FLATSIZE))
((EQ COMPILER-STATE 'MAKLAP)
;IF COMPILING A TOP-LEVEL FORM FROM A FILE,
; ARRANGE FOR A DEFPROP IN THE LAP FILE
(COUTPUT (LIST 'DEFPROP
(CADR FORM)
(FLATSIZE FORM)
'STRANGE-FLATSIZE)))
((EQ COMPILER-STATE 'COMPILE)
;WE DON'T WANT A DEFPROP IN THE
; MIDDLE OF ANY LAP CODE!
(ERROR 'STRANGE-DEFUN/ IN/ SUBFORM
FORM
'FAIL-ACT))))
[2C] EXPR-HASH
THIS FEATURE CONTROLS THE AUTOMATIC OUTPUTTING BY THE
COMPILER OF A DEFPROP FOR EACH FUNCTION COMPILED WHICH
DEFINES AN "EXPR-HASH" PROPERTY FOR THAT FUNCTION. THIS
PROPERTY IS A NUMBER, WHICH IS THE SXHASH OF THE
LAMBDA-FORM STORED AS THE EXPR PROPERTY OF THE FUNCTION
WHEN USED IN EXPRFORM. THE INTENDED USE OF THIS IS TO
HAVE A QUICK, AUTOMATIC SCHEME TO DECIDE WHICH FUNCTIONS
HAVE BEEN EDITED SINCE COMPILATION, AND TO READ IN THE
EXPR VERSIONS OF THOSE CHANGED FUNCTIONS. STORING THE
SXHASH OF THE LAMBDA DEFINITION OF THE FUNCTION LENDS
ITSELF TO SIMPLE, QUICK, AND NON-SPACE-CONSUMING (IF NOT
COMPLETELY FOOLPROOF) METHODS. IT IS SET EITHER BY
A DECLARATION
(DECLARE (EXPR-HASH <T-OR-NIL>))
OR BY USING THE "E" SWITCH IN THE MAKLAP COMMAND LINE.
[SEE ITEM [3] BELOW FOR AN ASSOCIATED CHANGE IN DEFUN.]
[2D] SOBARRAY
THIS VARIABLE HOLDS A POINTER TO THE STANDARD LISP OBARRAY,
IN WHICH THE COMPILER ITSELF IS RESIDENT. "COBARRAY" HOLDS
THE ARRAY POINTER TO THE COMPILER'S OBARRAY USED WHILE
COMPILING FILES. THESE TWO VARIABLES FACILITATE WRITING
OBARRAY-SWITCHING FUNCTIONS.
[2E] EOC-EVAL
THIS VARIABLE HOLDS A LIST OF FORMS TO BE EVALUATED
AFTER COMPILATION OF A FILE HAS BEEN COMPLETED. ONE CAN
SET IT FROM A DECLARE, OR USE THE FUNCTION "EOC-EVAL"
WHICH CONSES THE ITEMS OF THE CALLING FORM ONTO THE LIST
STORED IN EOC-EVAL. AT THE TIME OF COMPLETION OF
COMPILATION, (MAPC 'EVAL EOC-EVAL) IS DONE.
EOC-EVAL IS RESET BY INITIALIZATION, OR BY THE WHIM
OF THE USER.
[2F] COUTPUT
THIS FUNCTION SHOULD BE USED TO OUTPUT RANDOM FORMS
TO THE LAP FILE. THIS IS CURRENTLY DONE BY USING
PRINT; THUS ONE USED TO SAY, FOR EXAMPLE
(DECLARE (PRINT (LIST 'SETQ
'VERSION
(CADR (STATUS UREAD)))))
IT IS ANTICIPATED, HOWEVER, THAT EVENTUALLY THE COMPILER
MAY NOT WRITE A LAP FILE, BUT WILL BUFFER UP FORMS
FOR THE ASSEMBLY PASS. THEREFORE THE FUNCTION
COUTPUT SHOULD BE USED INSTEAD:
(DECLARE (COUTPUT (LIST 'SETQ
'VERSION
(CADR (STATUS UREAD)))))
WHICH WILL DO THE CORRECT THING IN THE FUTURE
WHEN THE BUFFERING MODE MATERIALIZES.
[3] THE VALUE OF THE VARIABLE DEFUN CONTROLS A CROCK IN THE
WORKINGS OF THE FUNCTION DEFUN. IF THE VALUE OF DEFUN
IS NON-NIL, THEN EVALUATING (DEFUN FOO ...) WILL SUCCEED
IN CREATING THE NEW DEFINITION ONLY IF EITHER:
[A] FOO HAS NO EXPR-HASH PROPERTY.
[B] FOO HAS AN EXPR-HASH PROPERTY, BUT IT IS NOT
THE SAME AS SXHASH OF THE LAMBDA FORM FOR THE
NEW DEFINITION.
THUS A POOR MAN'S WAY TO USE THE COMPILER'S EXPR-HASH
FEATURE IS TO COMPILE A FILE WITH THE (E) SWITCH,
LOAD IT INTO A LISP, EDIT THE FILE SOME, DO (SETQ DEFUN T),
THEN JUST READ IN THE UPDATED SOURCE, AND THE EXPR-HASH
SCHEME WILL (PROBABLY) REDEFINE ONLY THOSE FUNCTIONS
WHICH HAVE CHANGED, AND LEAVE THE SUBR VERSIONS IN FORCE
FOR UNCHANGED FUNCTIONS, PROBABLY.
[4] THE NEW SUBR OF ONE ARGUMENT, PLIST, IS USED TO RETRIEVE THE
PROPERTY LIST OF A SYMBOL; THIS FUNCTION WORKS ON ALL SYMBOLS
INCLUDING NIL, WHEREAS CDR WILL WORK ONLY FOR NON-NULL SYMBOLS
IN NON-*RSET MODE. SIMILAR REMARKS HOLD FOR THE NEW SUBR OF TWO
ARGUMENTS, SETPLIST. (SETPLIST X (PLIST X)) SHOULD BE A NOOP.
[5] IF "ROMAN" IS A FEATURE OF THE LISP YOU ARE USEING, THEN
YOU CAN TRY (SETQ IBASE 'ROMAN) OR (SETQ BASE 'ROMAN) FOR
FUN AND GAMES; OTHERWISE, NO.
[6] IN THE DEC-10 VERSION OF MACLISP, (STATUS JNAME) RETURNS
THE ATOMIC SYMBOL "NNNLSP", WHERE NNN IS THE JOB NUMBER
IN DECIMAL. THIS IS A STANDARD FIRST FILE NAME FOR
TEMPORARY FILES, ETC.
[7] TO MAKE THE ← FORMAT OF FIXNUM OUTPUT MORE USEFUL,
THE FOLLOWING FORMATS ARE NOW USED [WHEN IBASE IS 8
AND (STATUS ←) IS T]:
IF THE NUMBER IS SMALLER THAN 2**18.,
OR IF THE LOW NINE BITS IN THE BINARY REPRESENTATION
ARE NOT ALL ZERO,
THEN THE ← FORMAT IS NOT USED.
IF THE LOW 41 BITS ARE ALL ZERO, THEN N←41 IS USED.
IF THE LOW 33 BITS ARE ALL ZERO, THEN N←33 IS USED.
IF THE LOW 22 BITS ARE ALL ZERO, THEN N←22 IS USED.
OTHERWISE, N←11 IS USED.
NOTE THAT THESE CORRESPOND TO QUARTER-WORD BOUNDARIES
(EXCEPT N←41); BUT N←11 IS NOT USED IF 6 OR FEWER
DIGITS WOULD SUFFICE.
[8] (STATUS FREE ...) AND (SSTATUS FREE ...) HAVE BEEN, OR
SOON WILL BE, FLUSHED, SINCE THEY ARE OBSOLETE AND
MAINLY A PAIN TO MAINTAIN.
[9] MANY CHANGES TO THE BREAK FUNCTION:
[9A] BREAK OF THREE ARGUMENTS HAS BEEN FLUSHED.
(THE THIRD ARGUMENT USED TO BE A FORM TO BE
EVALUATED IF ≠P WERE TYPED.)
[9B] *BREAK (ERGO ALSO BREAK) NOW LAMBDA-BINDS
*, +, AND - TO THEIR OWN CURRENT VALUES SO THAT
THEY WILL BE RESTORED ON EXIT FROM THE BREAK.
[9C] (STATUS BREAKLEVEL) AND (SSTATUS BREAKLEVEL <FORM>)
ARE ANALOGOUS TO (STATUS TOPLEVEL) AND
(SSTATUS TOPLEVEL <FORM>). THE DEFAULT BREAKLEVEL,
LIKE THE DEFAULT TOPLEVEL, IS A READ-EVAL-PRINT
LOOP WHICH UPDATES *, +, AND - PROPERLY.
[9D] BREAK HAS BEEN REDEFINED USING CATCH, WITH A
CATCH-TAG OF "BREAK". IF AT ANY TIME WITHIN A
BREAK THE FORM (THROW <VALUE> BREAK) IS EXECUTED,
THE BREAK (OR *BREAK) FUNCTION WILL BE EXITED,
RETURNING <VALUE>. THUS, FOR EXAMPLE, IF ONE
TIRES OF TYPING (RETURN '(FOO)) TO UNBND-VRBL
BREAKS OR WHATEVER, ONE MIGHT DEFINE A MACRO-
CHARACTER
(SETSYNTAX '/: 'MACRO
'(LAMBDA NIL
(THROW (LIST (READ)) BREAK)))
AND SIMPLY TYPE :FOO AT THE UNBND-VRBL BREAK
TO USE THE VARIABLE FOO INSTEAD.
BELOW IS A NEW DEFINITION OF THE BREAK AND *BREAK FUNCTIONS W
WRITTEN IN LISP, AS WELL AS A HALF-HEARTED ATTEMPT AT
EXPLAINING THE TOP LEVEL LOOP.
(DEFUN BREAK FEXPR (X)
(*BREAK (EVAL (CADR X)) (CAR X)) ;NOTE ARGUMENT REVERSAL
;;; THE FIRST ARGUMENT TO BREAK IS A SWITCH, WHICH IF NIL CAUSES
;;; IMMEDIATE EXIT WITH NOTHING BEING DONE;
;;; OTHERWISE, THE VARIABLES ↑Q, ↑W, AND EVALHOOK ARE BOUND
;;; TO NIL, AND THE VARIABLES *, +, AND - ARE BOUND TO THEIR
;;; CURRENT VALUES, AND THE MESSAGE ";BKPT <BREAKID>" IS PRINTED.
;;; A READ-EVAL-PRINT LOOP SIMILAR TO THE TOP LEVEL LOOP
;;; IS THEN ENTERED. THIS BREAK LOOP IS SURROUNDED BY AN
;;; ERRSET AND A CATCH. ERRORS MERELY CAUSE THE BREAK
;;; LOOP TO BE RE-ENTERED.
;;; THE VALUE OF (STATUS BREAKLEVEL) SERVES A FUNCTION
;;; SIMILAR TO THAT OF (STATUS TOPLEVEL) IN THE TOP LEVEL
;;; LOOP.
;;; AS EACH FORM IS READ IN THE DEFAULT BREAK LOOP, THERE ARE
;;; FOUR CASES:
;;; [1] END OF FILE. THIS INDICATES OVER-RUBOUT AND
;;; SIMPLY CAUSES A TERPRI.
;;; [2] THE FORM IS THE ATOM ≠P. *BREAK RETURNS NIL.
;;; [3] THE FORM IS (RETURN <VALUE>). THE FORM <VALUE>
;;; IS EVALUATED AND RETURNED.
;;; [4] OTHERWISE, THE FORM IS EVALUATED AND THE RESULT
;;; PRINTED OUT IN A MANNER ANALOGOUS TO THE TOP
;;; LEVEL READ-EVAL-PRINT LOOP. THE VARIABLES +, -,
;;; AND * ARE UPDATED APPROPRIATELY. (RECALL, HOWEVER,
;;; THAT THEY WERE BOUND ON ENTRY TO *BREAK, AND SO
;;; WILL BE RESTORED EVENTUALLY.)
;;; THE WAY TO RETURN FROM A BREAK IS TO DO A THROW WITH
;;; A TAG OF "BREAK"; THIS WILL RETURN FROM THE CATCH WHICH
;;; SURROUNDS THE BREAK LOOP. THIS IS HOW CASES [2] AND [3]
;;; RETURN THEIR VALUES; CASE [4] MAY ALSO CAUSE A RETURN FROM
;;; THE BREAK.
(DECLARE (SPECIAL ≠Q ↑W EVALHOOK * + -))
(DEFUN *BREAK (BREAKP BREAKID)
(AND BREAKP
((LAMBDA (↑Q ↑W EVALHOOK * + -)
(TERPRI)
(PRINC '/;BKPT/ )
(PRINC BREAKID)
(SETQ + -)
(CATCH (DO NIL
(NIL)
(ERRSET (DO ((EOF (LIST NIL)) (FORM))
(NIL)
(COND ((STATUS BREAKLEVEL)
(EVAL (STATUS BREAKLEVEL)))
(T (SETQ FORM (READ EOF))
(COND ((EQ FORM EOF) (TERPRI))
((EQ FORM '≠P)
(THROW NIL BREAK))
((EQ (CAR FORM) 'RETURN)
(THROW (EVAL (CADR FORM))
BREAK))
(T (SETQ - FORM)
(SYSPRINT (SETQ *
((LAMBDA (+)
(EVAL FORM))
(PROG2 NIL +
(SETQ + -)))))
(TERPRI))))))))
BREAK)
(OR (STATUS LINMODE) (TERPRI)))
NIL
NIL
NIL
*
+
-)))
(DEFUN SYSPRINT (X) ;INTERNAL PRINTING FUNCTION
(OR (STATUS LINMODE) (TERPRI))
(COND (PRIN1 (FUNCALL PRIN1 X))
(T (PRIN1 X)))
(TYO 40))
(DEFUN STANDARD-TOP-LEVEL NIL
(PROG (↑Q ↑W ↑R EVALHOOK BASE IBASE ...)
ERRS ;ERRORS, UNCAUGHT THROWS, ETC. COME HERE
(RESET-BOUND-VARS)
↑G ;↑G QUITS COME HERE
(RESET-INTERNAL-TOP-LEVEL-VARS)
(RESTORE-THE-WORLD)
(DO-DELAYED-INTERRUPTS)
;RECALL THAT ERRORS DO (SETQ // ERRLIST) SO LAMBDA-BINDING ERRLIST WORKS
(MAPC (FUNCTION EVAL) //)
(AND (STATUS LINMODE) (TERPRI))
(SETQ * '*)
(DO ((EOF (LIST NIL))) (NIL)
(RESET-INTERNAL-TOP-LEVEL-VARS)
(SETQ * (COND ((STATUS TOPLEVEL)
(EVAL (STATUS TOPLEVEL)))
(T (SYSPRINT *)
(TERPRI)
(DO ((FORM (READ EOF) (READ EOF)))
((NOT (EQ FORM EOF))
(SETQ - FORM))
(TERPRI))
((LAMBDA (+) (EVAL -))
(PROG2 NIL + (SETQ + -)))))))))
(DEFUN RESTORE-THE-WORLD NIL
(RESET-THE-PDLS)
(SETQ ↑Q NIL)
(SETQ EVALHOOK NIL)
(RESTORE-THE-IO-SYSTEM)
(ENABLE-SYSTEM-INTERRUPTS)
(RESET-INTERNAL-GC-MARK-BITS))
(DEFUN DO-DELAYED-INTERRUPTS NIL
(OR INTERNAL-NOINTERRUPT-SWITCH
(PROCESS-PENDING-ALARMCLOCK-AND-TTY-INTERRUPTS)))
12/8/74 JONL & GLS
Remember, BIBOP LISP is now the standard system LISP!
[As of version number 958].
LISTARRAY has been extended to be an LSUBR. an optional second
argument puts a bound on the number of elements to LISTIFY.
For example, (LISTARRAY ary 5) lists only the first five elements
of ary; while (LISTARRAY ary), as before, lists all elements.
note that (LISTARRAY ary (APPLY 'TIMES (CDR (ARRAYDIMS ary))))
also lists all elements.
MAKOBLIST, MAKREADTABLE, and BLTARRAY have been flushed. If you
used them before, you can substitute calls as in the table below:
FOR THIS CODE USE THIS INSTEAD
(BLTARRAY x y) (FILLARRAY Y X)
;note reversal of args
(MAKREADTABLE x) (*ARRAY x 'READTABLE)
x not T or NIL
(MAKREADTABLE t-or-nil) (*ARRAY (GENSYM) 'READTABLE t-or-nil)
(MAKOBLIST x) (*ARRAY x 'OBARRAY)
x not NIL
(MAKOBLIST NIL) (LISTARRAY
OBARRAY
(- (CADR (ARRAYDIMS 'OBARRAY)) 129.))
Note that FILLARRAY is consistent in that it always transfers
the contents of its second arg into the first, and returns
the first (an array). Note too that this means that when
replacing a BLTARRAY by a FILLARRAY, you must reverse the args.
SYMEVAL lives! If you know that you are evaluating an atomic symbol,
it will be faster to use SYMEVAL rather than the general-purpose
EVAL. In particular, as soon as BIBOP LISP becomes the settled
standard, SYMEVAL will compile optimally into two instructions.
In *RSET mode, all car-cdr calls are checked at each level to see
that CAR or CDR is applied only to proper data. This checking is
not done by compiled code [which usually open-codes car-cdr ings]
[this is not really true, because compiled code calls functions
like CDDDDR, even if the user does not explicitly use them],
nor when *RSET = NIL. CAR and CDR are variables which control
the checking as follows:
LIST can hack only lists
NIL can hack lists and NIL
SYMBOL can hack lists, NIL, and symbols
T can hack anything.
When in *RSET mode, the value of CDR controls the permissible
operations for the function CDR, and the value of CAR controls
the permissible operations for the function CAR.
FRIDAY SEPT 13,1974 LQ+4D.19H.41M.28S. LISP 909 - GLS -
BRIEF SYNOPSIS:
[1] NEW FUNCTION: FSC. SIMILAR TO LSH AND ROT.
[2] NEW STATUS OPTION: (STATUS TTYSIZE).
[3] REMPROP CHANGED TO RETURN USEFUL QUANTITY.
[4] ISQRT HAS BEEN FLUSHED. CODE BELOW SUPERSEDES IT.
[5] (EXPT X .5) IS INHERENTLY LESS ACCURATE THAN (SQRT X).
[6] FASLOAD FILES CAN BE CONCATENATED.
[7] (IOC W) PROBLEM EXTENDS TO IOG. GRUMBLE. BEWARE!
----------------------------------------------------------------
[1] NEW FUNCTION: FSC IS ANALOGOUS TO ROT AND LSH.
IT ACCEPTS EITHER FIXNUMS OR FLONUMS, AND ACTS UPON
THE BITS GIVEN IT; I.E. LIKE ROT AND LSH IT DOES NOT
DO THE FLOAT OR FIX FUNCTION. UNLIKE ROT AND LSH, HOWEVER,
FSC RETURNS A FLONUM. NOTE THAT THE FSC PDP-10 INSTRUCTION
NORMALIZES THE RESULT. THIS IS A PDP-10 DEPENDENT FUNCTION!
(FSC N 0) IN PARTICULAR IS INTENDED TO BE THE INVERSE
OF (LSH N 0); NAMELY, IT TAKES A FIXNUM AND MAKES THE
BITS OF THAT FIXNUM INTO A FLONUM (THAT IS, IT USES THE
FIXNUM AS THE MACHINE REPRESENTATION OF THE FLONUM).
IN GENERAL, (= F (FSC (LSH F 0) 0)) FOR ANY FLONUM F,
BUT (= X (LSH (FSC X 0) 0)) FOR FIXNUM X IFF X IS
THE REPRESENTATION OF A *NORMALIZED* PDP-10 FLONUM.
[2] (STATUS TTYSIZE) RETURNS A DOTTED PAIR OF THE TTY'S CURRENT
HEIGHT AND WIDTH (ANALOGOUS TO CURSORPOS OF NO ARGS).
THESE ARE THE PARAMETERS AS RETURNED BY THE SYSTEM, WHICH
PRESUMABLY ARE SETTABLE VIA :TCTYP.
[3] REMPROP, IF IT FINDS THE PROPERTY TO REMOVE, INSTEAD OF
RETURNING T, RETURNS THE CELL OF THE PROPERTY LIST WHOSE
CAR IS THE PROPERTY (THIS CELL WAS SPLICED OUT FROM THE
PROPERTY LIST).
[4] ISQRT HAS BEEN FLUSHED FROM THE LISP SYSTEM. THE LISP
CODE BELOW IS MORE ACCURATE AND WORKS ON BIGNUMS.
(DEFUN BSQRT (N)
(BSQRT1 (ABS N)
(EXPT 2 (// (1+ (HAULONG N)) 2))))
(DEFUN BSQRT1 (N GUESS)
((LAMBDA (NEXT)
(COND ((LESSP NEXT GUESS)
(BSQRT1 N NEXT))
(T GUESS)))
(*QUO (*PLUS GUESS (*QUO N GUESS)) 2)))
THIS IS ESSENTIALLY A NEWTON ITERATION (DUE TO GOSPER)
WITH APPROPRIATE PRECAUTIONS FOR INTEGER TRUNCATION.
[5] (EXPT X .5) IS INHERENTLY LESS ACCURATE THAN (SQRT X).
USE THE LATTER WHEN YOU KNOW IT'S SQRT.
[6] IF YOU CONCATENATE SEVERAL FASLOAD FILES SO THAT THE
BEGINNING *FASL* OF THE NEXT FOLLOWS THE TERMINATING *FASL*
OF THE PREVIOUS ONE, THEN FASLOAD WILL GO 'ROUND THE
FASLOAD CYCLE AGAIN AND LOAD IT UP TOO. CURRENTLY
THERE IS NO CONVENIENT WAY TO CONCATENATE FASLOAD FILES,
BUT I NEVER PROMISED YOU A ROSE GARDEN.
[7] REMEMBER THE (IOC W) BUG, GANG? IT STILL HAUNTS US!
NAMELY, (IOC W) RESETS THE TTY OUTPUT BUFFER, THUS POSSIBLY
LOSING CHARACTERS FROM THE PREVIOUS OUTPUT FUNCTION.
THE RIGHT WAY TO DO IT IS (SETQ ↑W T). WELL, IT FOLLOWS
THAT (IOG W <FORMS>) ISN'T THE RIGHT THING EITHER.
THE RIGHT THING IS (IOG NIL (SETQ ↑W T) <FORMS>).
I DON'T LIKE IT EITHER.
[8] POOR SIGNP!
AUG 17, 1974 LISP 893 - GLS AND JONL -
[1] A NEW LAP, INCOMPATIBLE WITH OLDER LISPS, IS STANDARD
[2] NEW FUNCTIONS: ↑, ↑$. EXPT EXTENDED.
[3] NEW EDITOR COMMANDS: SS, RS, PC.
[4] BOUNDP HAS BEEN CHANGED TO SAVE CONSING.
[5] ERRFRAME HAS BEEN CHANGED TO GIVE OUT MORE INFO.
[6] THROWING OUT OF A TTY INTERRUPT CAN LEAD TO LOSSAGE.
[7] DONT USE (IOC W) IF YOU REALLY WANT (SETQ ↑W T).
[8] NCOMPLR RECOGNIZES "COMPLR (INIT)" FILES.
[9] IN LISP, YOU CAN NOW (SETQ IBASE 'ROMAN). DITTO FOR BASE.
----------------------------------------------------------------
[1] LAP 81 IS THE STANDARD LAP NOW, AND IS WHAT YOU GET BY
AUTOLOAD. SINCE IT WILL NOT WORK IN LISPS WITH VERSION
NUMBERS LESS THAN 892, YOU WILL HAVE TO RETRIEVE THE OLDER
LAP EXPLICITLY IF YOU NEED IT. DO (FASLOAD LAP OFASL COM)
BEFORE TRYING TO USE LAP IN AN OLDER LISP.
LAP NOW USES THE VALUE OF THE VARIABLE FASLOAD IN THE
SAME WAY FASLOAD ITSELF DOES: IF IT IS NIL, THEN MESSAGES
ABOUT FUNCTIONS REDEFINITIONS ARE SUPPRESSED. ALSO, LAP
NOW TRIES TO DO PURE LOADINGS WHEN THE VALUE OF "PURE" IS
NON-NIL.
[2] NEW FUNCTIONS:
↑ TAKES TWO FIXNUMS A AND B, AND RETURNS A TO THE B'TH
POWER AS A FIXNUM (MODULO 2↑35.). WILL NOT DO BIGNUM
ARITHMETIC.
↑$ TAKES A FLONUM AND A FIXNUM, RETURNING A FLONUM.
EXPT HAS BEEN EXTENDED. IF THE EXPONENT IS A FLONUM,
THEN THE BASE IS CONVERTED TO A FLONUM, AND THEN
THE FORMULA B (B LOG A)
A = E
IS USED, USING THE LOG AND EXP FUNCTIONS.
[3] NEW COMMANDS FOR THE BINFORD EDITOR:
SS (SAVE SPOT) GOBBLES THE NAME OF AN ATOMIC
SYMBOL, AND SETQ'S IT TO THE CURRENT EDITOR
CONTEXT.
RS (RESTORE SPOT) GOBBLES SUCH A SETQ'D ATOMIC SYMBOL
AND MAGICALLY MOVES THE EDITOR'S CURSOR TO THE
SAVED SPOT.
PC (PRINT CONTEXT) GOBBLES UP TO TWO FLONUMS (TERMINATE
WITH $$) AND, USING THEM FOR THE PRINLEVEL AND
PRINLENGTH, PRINTS THE CURRENT LEVEL OF LIST
STRUCTURE. IF YOU DON'T SUPPLY TWO ARGS,
DEFAULTS OF 4 ARE USED.
[4] BOUNDP IS NOW A PURE PREDICATE; IT RETURNS T OR NIL.
ONE CAN GET THE OLD EFFECT OF BOUNDP BY SAYING
(AND (BOUNDP X) (CONS NIL (EVAL X))).
THERE WILL SOOON BE A SPECIAL FUNCTION FOR OBTAINING THE
VALUE OF A SYMBOL, WHICH WILL RUN A LITTLE FASTER THAN
"EVAL", AND WHICH WILL COMPILE QUITE OPTIMALLY. THUS,
(AND (BOUNDP X) (SYMEVAL X)) WILL COMPILE INTO MUCH
FASTER CODE THAN THE WILL THE CURRENT FORM:
(AND (SETQ FOO (BOUNDP X)) (CDR FOO))
[5] ERRFRAME HAS BEEN CHANGED TO GIVE YOU MORE INFORMATION.
FORMERLY THE THIRD ITEM OF THE RETURNED LIST WAS THE
ERROR MESSAGE ONLY. NOW IT IS A LIST OF FROM ONE TO
THREE THINGS. IF IT IS ONE THING, IT IS THE ERROR MESSAGE.
YOU CAN PRINC THIS TO RE-CREATE THE ERROR PRINTOUT.
IF THERE ARE TWO THINGS, THE FIRST IS THE MESSAGE AND THE
SECOND IS THE LOSING ITEM. IF THERE ARE THREE THINGS,
THEY ARE THE ERROR MESSAGE, THE LOSING ITEM, AND THE
TYPE OF ERROR (E.G. FAIL-ACT OR UNBND-VRBL).
IN SHORT, YOU GET A LIST OF THINGS SUCH THAT
(APPLY 'ERROR (CADDR (ERRFRAME NIL)))
WILL RE-CREATE THE SAME ERROR!
[6] PEOPLE HAVE BEEN WRITING TTY INTERRUPT FUNCTION LIKE
(SSTATUS INTERRUPT 15.
'(LAMBDA NIL (THROW NIL TO-TOP-LEVEL))).
THERE IS A DANGER IN THIS: RECALL THAT WHEN A TTY USER
INTERRUPT IS RUN, THE SYSTEM DOES AN IMPLICIT
(NOINTERRUPT 'TTY)
FOR YOU TO PREVENT TIMING ERRORS. IF YOU EXIT THE USER
INTERRUPT ABNORMALLY, YOU MUST RESET NOINTERRUPT YOURSELF.
(SSTATUS INTERRUPT 15.
'(LAMBDA NIL (NOINTERRUPT NIL)
(THROW NIL TO-TOP-LEVEL)))
ALTERNATIVELY, THE TOP LEVEL COULD SAY
(NOINTERRUPT NIL)
AFTER CATCHING THE THROW, POSSIBLY A SAFER ALTERNATIVE
IN SOME CASES.
[7] LOSERS NOTE: (IOC W) IS NOT THE SAME AS (SETQ ↑W T).
IN GENERAL, WHEN YOU JUST WANT TO SET AN I/O SWITCH,
USE SETQ UNLESS YOU ARE AWARE OF THE SIDE EFFECTS INVOLVED.
(IOC W) IN PARTICULAR PERFORMS A SYSTEM (= ITS) I/O
RESET, CLEARING THE TTY OUTPUT BUFFER. IF ANY CHARS
ARE PENDING IN THE BUFFER FOR OUTPUT FROM THE PREVIOUS
PRINT, THEY WILL BE FLUSHED. THUS
(PROG2 (PRINC 'FOOBAR) (IOC W))
IS VERY LIKELY NOT TO PRINT ANYTHING AT ALL! OR MAYBE
JUST THE "F" IF YOU ARE LUCKY. (PROG2 (PRINC 'FOOBAR)
(SETQ ↑W T)) DOES WHAT YOU WANT AND LETS THE "FOOBAR"
PRINT OUT.
[8] NCOMPLR WILL LOOK FOR A "COMPLR (INIT)" FILE WHEN IT IS
STARTED UP, AND IF FOUND, WILL UREAD AND READ-EVAL IT IN.
YOU CAN FASLOAD OTHER FILES FROM THIS INIT FILE, BUT
CURRENTLY CANNOT UREAD OTHER FILES. THE INIT FILE MAY
BE EITHER ON YOUR DIRECTORY, OR ON THE "(INIT)" DIRECTORY.
MONDAY JULY 29,1974 FQ+3D.1H.24M.28S. LISP 873 - GLS -
THIS LISP RECENT IS SHORT, BUT ITEM [2] IS OF GREAT IMPORTANCE.
THE PREVIOUS LISP RECENT APPEARS AT THE END OF THIS ONE SINCE
IT HASN'T BEEN AROUND FOR VERY LONG.
BRIEF SYNOPSIS:
[1] *RSET-TRAP FUNCTION IS ALWAYS RUN AND MUST CHECK *RSET ITSELF
[2] (CAR NIL) AND (CDR NIL) ARE ALWAYS NIL
[3] DUMPARRAYS/LOADARRAYS NOW KNOW ABOUT FIXNUM AND FLONUM ARRAYS
----------------------------------------------------------------
[1] THE *RSET-TRAP USER INTERRUPT IS ALWAYS RUN WHEN AN
UNCORRECTABLE ERROR IS ABOUT TO POP BACK TO TOP LEVEL
OR TO AN ERRSET. IT IS UP TO THE *RSET-TRAP FUNCTION
TO CHECK THE *RSET SWITCH FOR ITSELF (THE SYSTEM-SUPPLIED
*RSET-TRAP FUNCTION INDEED DOES THIS).
[2] FOR COMPATIBILITY WITH INTERLISP (FOO), THE CAR AND CDR
OF NIL ARE ALWAYS BUT ALWAYS NIL. NIL STILL HAS A
PROPERTY LIST, AND GET AND PUTPROP STILL WORK ON IT,
BUT NIL'S PROPERTY LIST IS NOT ITS CDR (CROCK, CROCK).
THE CLAIM IS THAT ONE CAN WRITE CODE SUCH AS
(CADDR X)
INSTEAD OF THE MORE TIME- AND SPACE-CONSUMING
(AND (CDR X) (CDDR X) (CADDR X))
AND SO ON. SEND COMPLAINTS TO GLS, BUT I DOUBT IT WILL
DO YOU ANY GOOD.
[3] DUMPARRAYS AND LOADARRAYS WILL NOW DO THE CORRECT THING
WITH FIXNUM AND FLONUM ARRAYS. OLD DUMPARRAYS FILES ARE
STILL GOOD - THE HACK IS UPWARD COMPATIBLE.
FRIDAY JULY 19,1974 NM+8H.29M.40S. LISP 861 - GLS -
BRIEF SYNOPSIS:
[1] NEW FUNCTIONS: UPROBE, UCLOSE, UAPPEND
[2] DEFPROP NOW DOES REMPROP FIRST, AS DEFUN ALWAYS HAS
[3] (NOINTERRUPT 'TTY) - NEW NOINTERUPT OPTION
[4] PDLFRAME HAS DISAPPEARED - USE EVALFRAME
[5] (SSTATUS CRFILE ...) SETS UREAD FILE NAME DEFAULTS
[6] VALUE OF // INTERACTS WITH ERRLIST; *, +, - MENTIONED
[7] ONE MAY THROW OUT OF A USER INTERRUPT NOW
[8] APPLYFRAMES WIN BETTER - FEAR NOT
[9] UNPURIFY$G DEPURIFIES ALL PAGES - PURIFY$G WILL REPURIFY THEM
[:] COMPLR/NCOMPLR HAVE PRIVATE OBARRAY AS WELL AS READTABLE
[;] MIDAS AND FASLOAD COOPERATE
----------------------------------------------------------------
[1] THREE NEW FUNCTIONS FOR OLD I/O:
[1A] UPROBE TAKES ARGUMENTS LIKE UREAD, AND TRIES TO FIND
THE FILE SPECIFIED. IF IT EXISTS, UPROBE RETURNS THE
ACTUAL FILE NAMES; IF NOT, IT RETURNS NIL.
[1B] UCLOSE (OF NO ARGUMENTS) CLOSES THE UREAD INPUT
CHANNEL. THIS IS PRIMARILY OF USE BEFORE CALLING THE
SUSPEND FUNCTION.
[1C] UAPPEND (ARGUMENTS LIKE UREAD) OPENS THE SPECIFIED
FILE, WHICH MUST ALREADY EXIST, FOR WRITING.
THE FILE IS RENAMED TO BE ".LISP. APPEND", AND BECOMES
NON-ACCESSIBLE (YOU SEE A * NEXT TO IT IN THE
DIRECTORY). ANY OUTPUT DIRECTED TO THE UWRITE OUTPUT
CHANNEL (THE ↑R SWITCH) IS THEN OUTPUT TO THIS FILE,
APPENDED TO THE PREVIOUS CONTENTS. WHEN THE FILE
IS EVENTUALLY CLOSED WITH UFILE, IT WILL TAKE ON THE
FILE NAMES SPECIFIED BY UFILE, AND WILL CONTAIN ITS
OLD CONTENTS WITH THE NEW MATERIAL TACKED ONTO THE
END. NOTE THAT UAPPEND IS REALLY MORE LIKE NCONC
THAN APPEND! I.E. IT DOES NOT COPY THE FILE, BUT
ADDS ONTO THE EXISTING ONE, CLOBBERING IN NEW DATA.
[2] DEFPROP USED TO BE DESCRIBED AS
(DEFUN DEFPROP FEXPR (X)
(PUTPROP (CAR X) (CADR X) (CADDR X)))
THANKS TO AGITATION BY CERTAIN PARTIES, IT IS NOW
(DEFUN DEFPROP FEXPR (X)
(REMPROP (CAR X) (CADDR X))
(PUTPROP (CAR X) (CADR X) (CADDR X)))
THAT IS, DEFPROP IS GUARANTEED TO PUT THE NEW PROPERTY
AT THE HEAD OF THE PROPERTY LIST. NOTE THAT DEFUN HAS DONE
SUCH REMPROPING IN THE PAST ALREADY.
[3] NOINTERRUPT HAS BEEN EXTENDED TO HAVE THREE STATES:
(NOINTERRUPT T) CAUSES ALL ASYNCHRONOUS USER
INTERRUPTS TO BE DELAYED (AS BEFORE;
"ASYNCHRONOUS" INTERRUPTS ARE PRESENTLY
TTY CONTROL CHARS AND THE ALARMCLOCK)
(NOINTERRUPT NIL) LETS SUCH INTERRUPTS GO THROUGH
IMMEDIATELY (THE INITIAL STATE); ANY
DELAYED INTERRUPTS ARE RUN DURING THIS CALL.
*** (NOINTERRUPT 'TTY) CAUSES ONLY TTY INTERRUPTS TO
BE DELAYED, AND LETS OTHERS GO THROUGH.
IN THIS WAY ONE CAN SUPPRESS ↑G QUITS, ETC.,
BUT STILL ALLOW CLOCK INTERRUPTS.
[4] PDLFRAME, A SYNONYM FOR EVALFRAME, HAS DISAPPEARED.
USE EVALFRAME FROM NOW ON.
[5] (SSTATUS CRFILE FOO BAR) WILL SET THE UREAD FILE NAME
DEFAULTS TO "FOO BAR". (STATUS CRFILE) READS THEM,
AS BEFORE.
[6] THE ATOM // IS NOW A VARIABLE, USED IN CONJUNCTION
WITH ERRLIST. WHEN AN ERROR PROPAGATES BACK TO TOP LEVEL,
THEN WHERE THE TOP LEVEL FORMERLY DID
(MAPC (FUNCTION EVAL) ERRLIST)
IT NOW DOES INSTEAD
(MAPC (FUNCTION EVAL) //)
AND WHEN AN ERROR OCCURS, THEN (SETQ // ERRLIST)
IS PERFORMED. THUS THIS NEW MECHANISM WORKS ALMOST LIKE
THE OLD, WITH ONE IMPROVEMENT (SUGGESTED MY MACRAKIS):
ONE CAN LAMBDA-BIND ERRLIST OVER A COMPUTATION, AND IF
AN ERROR OCCURS THE CURRENT ERRLIST WILL BE USED AND NOT
THE TOP-LEVEL ERRLIST. THIS MAY SOMETIMES BE A DESIRABLE
ALTERNATIVE TO ERRSET.
RECALL AGAIN THAT *, +, AND - ALSO HAVE MEANINGFUL VALUES:
* CONTAINS THE LAST THING TYPED OUT BY LISP'S TOP
LEVEL. THUS IF YOU FORGOT TO TYPE A SETQ AROUND
THE PREVIOUS FORM, YOU CAN STILL RETRIEVE THE
RESULTANT VALUE.
+ CONTAINS THE LAST THING READ BY LISP'S TOP LEVEL.
THIS IS USEFUL IN CASE OF A TYPING ERROR; YOU CAN
SAVE THE FORM AND MAYBE EDIT IT.
- CONTAINS THE CURRENT THING READ BY THE TOP LEVEL
(WHEN EVALUATION OF THE THING IS COMPLETED, THEN
SOMETHING LIKE (SETQ + -) HAPPENS).
NOTE THAT ERROR BREAKS SAVE +, SO THAT IF YOU SAY:
(PLUS 3 'A) ;LOSEY LOSEY
A NON-NUMERIC VALUE ;LISP COMPLAINS
;BKPT WRNG-TYPE-ARG
(PLUS 3 5) ;DO SOME STUFF IN THE BREAK
10
$P ;RETURN FROM BREAK
A NON-NUMERIC VALUE ;LISP GRIPES AGAIN
(SETQ FOO +) ;NOW SAVE VALUE OF +
(PLUS 3 'A) ;IT IS FORM THAT LOST
[7] FORMERLY USER INTERRUPTS WERE AN IMMOVABLE WALL WITH
RESPECT TO THROWS; NOW THEY ARE TRANSPARENT. THIS
MEANS THAT YOU CAN THROW OUT OF A USER INTERRUPT IN
THE OBVIOUS MANNER. EXAMPLE:
(SSTATUS INTERRUPT 0 '(LAMBDA (X) (THROW NIL ABORT))
(CATCH (HAIRY-COMPUTATION) ABORT) ;HAIRY MESS
IN THIS WAY ONE CAN ABORT THE HAIRY MESS BY TYPING ↑@.
[8] SOME PEOPLE HAVE COMPLAINED OF SUPER-SLOWNESS WHEN RUNNING
IN *RSET MODE. THIS WAS DUE TO FAULTY DESIGN IN THE
APPLYFRAME ROUTINES, WHCIH CAUSED CONSING ON EVERY
FUNCTION CALL. THIS HAS BEEN CORRECTED, SO DON'T FEAR
TO USE *RSET MODE NOW.
[9] UNPURIFY$G TO A LISP OR BLISP WILL UNPURIFY ALL PURE
PAGES IN THE LISP BY COPYING THEM. THIS IS PRIMARILY
SO THAT JPG CAN WIN WHEN DUMPING MACSYMA. PURIFY$G
WILL THEN REPURIFY THE (COPIED) PAGES.
[:] NCOMPLR WINS WITH ARRAYCALL NOW, BUT COMPLR DOES NOT.
ALSO, BOTH COMPLR AND NCOMPLR HAVE A PRIVATE OBARRAY
AS WELL AS READTABLE (CALLED COBARRAY AND CREADTABLE).
[;] GREENBLATT (RG) HAS HACKED MIDAS SO THAT IT CAN PRODUCE
FASL FORMAT OUTPUT; THUS ONE CAN USE ALL THE MACRO
FEATURES TO PRODUCE CODE TO LOAD INTO LISP.
THE FOLLOWING IS A COPY OF AI:MIDAS;FASL > WRITTEN BY RG.
FASL Feature In Midas.
Midas can now assemble FASL files that can be loaded
by LISP in the same manner as LAP FASL output. This mode is
entered by the .FASL pseudo op, which must appear at the
beginning of the file before any storage words.
After .FASL has been seen, the assembly becomes a
two pass relocatable assembly. However, certain
restrictions and "changes of interpretation" apply.
Global symbols (declared as usual with " or .GLOBAL)
are persmissible. However, since the output is to be loaded
with FASLOAD using DDT's symbol table instead of STINK,
there are quite a few differences in detail.
For symbols defined within the current assembly, the
only effect of being declared GLOBAL is that the GLOBAL
information is passed on to FASL when the symbol table is
written at the end of pass 2. This in combination with the
SYMBOLS switch in FASLOAD determines whether the symbol gets
loaded into DDT's symbol table. If SYMBOLS is NIL, no
symbols will be loaded; if SYMBOLS is EQ to SYMBOLS, only
globals will be loaded; and if SYMBOLS is T, all symbols
(local and global) will be loaded. Once the symbol is
loaded (or not), the information as to its GLOBALness is
lost and, of course, makes no further difference. The
initial state when LISP is loaded is NIL.
GLOBAL symbols not defined in the current assembly
are also legal, but there are additional restrictions as to
where in a storage word they may appear and what masking may
be specified (as compared to a normal relocatable assembly).
Briefly, they may appear as in a storage word as a full
word, a right half, a left half, or an accumulator. They may
be negated, but can not be operated on with any other
operator. Error printouts will be produced if they appear
elsewhere. When the symbol is encountered by FASLOAD, DDT's
symbol table is consulted. If it is defined at that time,
OK, otherwise FASLOAD will generate an error.
Any sort of global parameter assignment or location
assignment is Forbidden. .LOP, .LVAL1, .LVAL2, etc are not
available.
New Pseudo OPs Available only in FASL assemblies.
The following pseudos are available to facilitate
the communication between MIDAS assembled programs and LISP
(particularily with regard to list structure).
.ENTRY function type args
Function is an atom and is taken as the name of
a function beginning at the current location. Type
should be one of SUBR, FSUBR or LSUBR, and has the
obvious interpretation. Args is a numeric-valued field
which is passed thru to FASLOAD and used to construct
the args property of the function. If it is zero, no
args property is created. Otherwise it is considered to
be a halfword divided into two 9 bit bytes, each of
which is converted as follows:
byte result
0 nil
777 777
otherwise n n-1
These two items are then CONSed and from the
args property.
The following pseudos may appear in constants!!
.ATOM atom
followed by a LISP atom in "MIDAS" format (see below).
May only appear in right half (or entire word) of a
storage word. Assembles into a pointer to the atom
header of the specified atom.
.SPECI atom
similar to .ATOM but assembles into a pointer to the
SPECIAL value cell of the specified atom.
.FUNCT atom
similar to .ATOM, but invokes special action by FASLOAD
in case the PURESW is on. Normally used in function
calls. Briefly, if FASLOAD is going to purify the
function it is loading, it must "snap the links" first.
If .FUNCT is used, the location will be examined by
FASLOAD and the link snapped if possible before
purification.
Typical usage:
CALL 2,.FUNCT EQUAL ;calls equal as a function of 2 args
; note: the CALL is not defined
; or treated specially by MIDAS.
.ARRAY atom
similar to .ATOM, but assembles into a pointer to the
Array SAR.
.SX S-expression
similar to .ATOM, but handles a LISP S-expression.
(See below).
.SXEVA S-expression
reads S expression. This S expression is EVALed (for
effect presumably) at FASLOAD time. The resulting
value is thrown away. Does not form part of storage
word.
.SXE S-expression
Similar to .SX but list is EVALed at FASLOAD time. The
resulting value is assembled into storage word.
The MIDAS "LISP READER"
By a conspiracy between MIDAS and FASLOAD, a version
of the LISP reader is available. However, due to historical
reasons (mostly, i.e. the FASLOAD format was originally
intended only to deal with COMPLR type output), there are a
number of "glitches" (see below for list). These will
probably tend to go away in the fullness of time.
a) numeric ATOM
The first character of a LISP atom is examined
specially. If it is a # or &, the atom is declared to be
numeric and either fixed (#) or floating (&). Midas then
proceeds to input a normal numberic field (terminated, note,
by either space or comma). This value is then "stored" in
the appropriate "space" (fixnum space or flonum space).
b) other ATOMs (also known as PNAME atoms or (LISP) SYMBOLS)
If the first character of the atom is not # or &,
the atom is a "PNAME" atom. / becomes a single character
quote character as in LISP. The atom may be indefinitely
long. The atom will be terminated by an unquoted space,
carrige return, tab, (, ), or semicolon. Unquoted linefeeds
are ignored and do not become part of the atom. The
character that terminates the atom is "used up" unless it is
a ( or ). Note that period is a legal constituent of a atom
and does not terminate it or act specially.
c) lists.
Work normally, but note following caution relative
to dot notation: . does not terminate atoms. Thus, to
invoke dot notation, the dot must be left delimited by a
space, tab, parenthesis, or other character that does
terminate atoms.
Glitches:
1) Restriction on pass dependant list
structure -- In any list reading operation, no new
atoms not previously encountered may be
encountered for the first time on pass 2.
However, this restriction does not apply to
atom-only reading operations (.ATOM, .SPECI,
.FUNCT etc).
2) Single quote for quoting does not exist (no
other macro characters exist either.)
3) Numbers must be flagged as above always.
MOVEI A,.ATOM 123 ;LOSES - gives pointer
; to PNAME type atom
; with PNAME 123. it is
; not numeric.
use:
MOVEI A,.ATOM #123 ;WINS
4) No provision exists to reference "GLOBALSYMS"
in FASLOAD. This mostly means only that DDT must
be present to load a MIDAS assembled FASL file.
(some simple COMPLR and LAP FASL files can
successfully be FASLOADed by, for example, a
disowned LISP running without a DDT.
5) LOC is illegal in a FASL assembly. BLOCK of a
non-relocatable quantity is ok.
6) Currently, symbol loading is VERY slow. Thus
use SYMBOLS nil, (the initial state) unless
symbols are necessary.
7) Midas does not know about any LISP symbols or
UUOs specially. Use them as globals until someone
gets around to fixing up a .INSRT file with the
appropriate defs.
8) .ATOM "should" be a special case of .SX .
However, it is handled separately because of the
following "reasons":
a) The previously noted restriction on pass
dependent LISTS.
b) Midas can do constants optimization on
atoms ppearing in constants (on both pass one
and pass two) but not on LISTS. Therefore,
each list is guaranteed to take a separate
word in the constants area even if it is
identical to some other list which also
appears in a constant.
c) Each list takes an additional entry in
FASLOAD's "atom" table. This is a temporary
table that is flushed after the FASLOADing is
complete. Of course, .SX still works for
atoms modulo the above noted restrictions and
inefficencies.
5/22/74 JONL
Brief Synopsis: for LISP 838 and greater
1) SUSPEND - new function, LSUBR of 0 or 1 arguments, like MACDMP,
but can continue where the computation left off, rather than
restarting at top level.
2) MUNKAM is the inverse of MAKNUM. On the PDP10 system, is pretty
much the same as CDR, except that the argument is required to be
a fixnum, and the COMPLRs will open-code MUNKAM.
3) RANDOM will accept two arguments, as a means of "seeding" it.
Also, a slight deficiency has been noted.
4) A programmable features list for (STATUS FEATURE foo), and an aid,
(SSTATUS LINMODE T), for systems with line rather than character
oriented TTY input.
5) ARRAYCALL, SUBRCALL, AND LSUBRCALL are now all FSUBRs, and
take an extra argument to aid NCOMPLR in open-coding these
applications. Disregard any previous notes on these functions,
and note well below.
6) Examples of some particularly useful lisp macros, especially for
users of ARRAYCALL, SUBRCALL, and LSUBRCALL.
7) The compiler declaration ARRAY* has been extended to allow
information about the ranges of indices. Also, NCOMPLR now uses
its own private obarray when compiling a file, in addition to its
own private readtable.
--------------------------------------------------------------------
1) (SUSPEND) may be executed at any point in a computation, and
control will be returned to the LISP's superior [DDT or monitor].
Accumulators, push-down stacks, and other variables will be saved,
and its starting address will be set so that if the job be dumped
on dsk, and reloaded at some future time, starting it again will
cause it to resume where the computation and continue just after
the call to SUSPEND. One limitation: if any input-output devices
are in use other than the TTY, SUSPEND will error with a fail-act.
(SUSPEND s), like (MACDMP s), passes the characters of the symbol
s to the superior job as a valret string.
2) By "inverse of MAKNUM", the following is meant:
(EQ X (MUNKAM (MAKNUM X))) evaluates to T for all X. Shortly,
the MULTICS implementation will have a reasonable version of
MAKNUM and MUNKAM implemented, so that one may write a
hash-coder-on-EQ for s-expressions. Previous notes in LISP ARCHIV
have given examples on how to hash an s-expression on EQUAL. By
replacing "(\ (SXHASH X) 777))" with "(\ (MAKNUM X) 777)" one
will have a hasher on EQ.
3) By "seeding" RANDOM, one may obtain a variety of starting points,
corresponding to the various internal states of the two-word state
register. Any two successive outputs of RANDOM will do as the
two words for a seed; for example, (SETQ X (RANDOM) Y (RANDOM))
will preserve the current state of the random number generator
in the variables X and Y, and the state may be restored to that
state [after, possibly, further usage of RANDOM] by (RANDOM X Y).
Users of RANDOM should take note of a fact which Bill Gosper
ferreted out of Knuth - this random number genertor flunks the
3-way serial test. That is, if triplets of "random" numbers
<x[n], y[n], z[n]> are generated by clumping together the
3n, 3n+1, and 3n+2 outputs of RANDOM, then there will be an
interdependency among the triples such that half of all triples
will be missed - not particularly good for picking "random"
points in 3-space. One way out of this bind is simply
to use only every other output of RANDOM in generting the triples.
4) As described in previous notes, there is an internal list of
"features" describing which of the various MACLISP options are
actually available in the LISP being used, and which time-sharing
system it is running under. Now the user can create his own
feature names and add, or delete, from this list at will.
(STATUS FEATURE FOO)
is non-NIL if and only if FOO is on the features list;
(SSTATUS FEATURE FOO)
will add FOO to the features list, and
(SSTATUS NOFEATURE FOO)
will delete it.
(SSTATUS LINMODE T)
tells the time-sharing system not to activate your job while
waiting for TTY input until a carriage-return is typed. For the
TOPS-10 system, it means the basic input instruction is INCHRW
instead of INCHR, and that the time-sharing system will handle
rubouts until the carriage-return is typed. Since the ITS system
does not handle rubouts under any circumstances, many users want
a mode under which the rubout handler of the MACLISP reader will
be effective on a line-by-line basis, and under which no read
reading is done until a carriage-return is typed. This can be
achieved as follows:
(SSTATUS SYNTAX 13. 501540)
;makes <cr> an invisible force-feed char
(SSTATUS LINMODE T)
;tells ITS to sleep until <cr> or <rubout>
(SSTATUS TTYREAD T)
;tells LISP's reader to forget about looking for
;"balanced" s-expressions before actually gobbling
;up characters from the TTY
It is worthwile to note here that the "force-feed" option on <cr>,
and the TTYREAD option are properties of LISP's readtable, while
the LINMODE option is a property of the LISP's relation with the
time-sharing system.
5) There has long been a certain ambiguity in LISP with respect to
the meaning of an atomic function. For (FOO X Y), most LISP
systems will scan the property list of FOO to see if there are
any functional properties [such as SUBR, EXPR, etc], and if so,
use the first one found as the functional-interpretation of FOO;
if none are found, then the value of FOO as a variable is picked up,
and the function-hunting process continues recursively. Some other
systems always pick up the variable value, and never resort to
storing subroutine addresses, or LAMBDA forms, as "properties" on
a property list. The function FUNCALL was implemented as a means
of directing the MACLISP evaluator first to the variable
value as function rather than starting out on the functional
properties. Thus, (FUNCALL FOO X Y) is equivalent to
(APPLY FOO (LIST X Y)). However, FUNCALL is essentially an
interpretation, and the COMPLR can not open-code the dispatch to
the function of interest unless more is known about its calling
conventions. For this reason, ARRAYCALL, LSUBRCALL, and SUBRCALL
have been implemented as FSUBRs. The general forms are
(ARRAYCALL type ap i1 . . . in)
(LSUBRCALL type lfun arg1 . . . argn)
(SUBRCALL type fun arg1 . . . argn)
type should be either "FIXNUM", "FLONUM", "T", or "NIL", depending
on the resulting type of value returned by the function [or on the
array type, in the case of ARRAYCALL. Both T-type and NIL-type
arrays may be specified by NIL here, which simply means
"s-expression" array rather than "numeric" array.]. ap should
evaluate to an array pointer such as created by *ARRAY
[(1) returned by *ARRAY if its first argument is NIL, or (2) put
on the property list of the given non-NIL symbol]. lfun should
evaluate to an LSUBR pointer, which on the PDP10 systems is obtained
only by doing (GET 'FOO 'LSUBR) for some LSUBR FOO; similarly, fun
should evaluate to a SUBR pointer. The reason the type argument is
required is that NCOMPLR can generate optimal code for these
applications. Versions of NCOMPLR greater than 454 will code these three
functions open [COMPLR will not be nearly so optimal in its codings of these
three. Neither will COMPLR actually open-code array references.].
in the case of SUBRCALL and LSUBRCALL, the type info is mainly
an aid to NCOMPLR, and type NIL could always be used as default;
however, using type FIXNUM or FLONUM where NIL is required
will result in wrong code. For ARRAYCALL, it will be necessary
always to have the correct type info since wrong code would result
from any kind of type mismatch.
EXAMPLE: suppose you have done
(SETQ BARODD (ARRAY NIL FIXNUM N) BAREVEN (ARRAY NIL FIXNUM N))
Now at this point, both BARODD and BAREVEN hold as value an array
pointer. They would have ARRAY properties on their property list
if, for example, (ARRAY BARODD FIXNUM N) had been done instead.
Then the following will fill BARODD with the first N odd integers,
and BAREVEN with the first N even integers:
(DO I 1 (1+ I) (> I (* 2 N))
(STORE (ARRAYCALL FIXNUM
(COND ((ODDP I) BARODD) (BAREVEN))
(/ (1- I) 2))
I))
6) EXAMPLE USING MACROS FOR SIMPLIFIED SYNTAX:
Assuming BARODD and BAREVEN as above [that is, variables that
have been set to some array pointer], let us define two macros
(DEFUN MACRO BO (X)
(SUBST (CADR X) 'INDEX '(ARRAYCALL FIXNUM BARODD INDEX)))
(DEFUN MACRO BE (X)
(SUBST (CADR X) 'INDEX '(ARRAYCALL FIXNUM BAREVEN INDEX)))
Then we could fill BARODD and BAREVEN as follows:
(DO J 1 (1+ J) (> J N) (STORE (BE (1- J)) (* 2 J)))
(DO J 0 (1+ J) (NOT (< J N)) (STORE (BO J) (1+ (* 2 J))))
Admittedly, this saves a lot of typing. But suppose you have a
host of such array variables that you would like to abbreviate
with such a MACRO. Typing in all the macro definitions could be
tediously repetitive. Consider the following macro-defining macro,
and some of its uses:
(DEFUN MACRO ABBA (Y)
(SUBLIS (LIST (CONS 'SHORT (CADR Y))
(CONS 'LONG (CADDR Y))
(CONS 'TYPE (CADDR Y)))
'(DEFUN MACRO SHORT (X)
(SUBST (CDR X)
'INDEXLIST
'(ARRAYCALL TYPE LONG . INDEXLIST)))))
Now we might use ABBA to produce the macro for BE, but note that
the form of the macro is slightly different - the main body of the
macro output appears to be a dotted-list rather than a standard
list. This is so that arrays of varying numbers of dimensions may
have their abbreviations defined by the same super-macro.
(ABBA BO BARODD FIXNUM)
expands into
(DEFUN MACRO BO (X)
(SUBST (CDR X)
'INDEXLIST
'(ARRAYCALL FIXNUM BARODD . INDEXLIST)))
which then causes the appropriate macro definition for BO. As
you would expect, then, (BO J) expands into
(ARRYACALL FIXNUM BARODD J)
But consider the two-dimensional hash array HASH defined as
(SETQ HASH (ARRAY NIL T 37 37))
Then (ABBA HA HASH T) defines HA so that (HA 3 (+ N 2)) expands
into (ARRAYCALL T HASH 3 (+ N 2))
Guy Steele has accumulated a file of sophisticated macros and
macro-defining macros, and the interested may consult with him
about them.
7) In order to get maximal speed from open-compiled array references,
you may inform NCOMPLR of the actual ranges of the array
indices. Thus a two-dimensional array of FIXNUMS, size 3 by 4,
could be declared by:
(ARRAY* (FIXNUM (CIR 3 4)))
Even partial information will be useful; a NIL or ? in index
positions will indicate that no information is available about that
particular dimension. For example, to add to the above declaration
that for a two-dimensional array in which only the column dimension
is known in advance, one could say:
(ARRAY* (FIXNUM (CORL ? 4) (CIR 3 4)))
The previous syntax for ARRAY* is still available, and one
should note that the following two forms both convey the same
information:
(ARRAY* (NOTYPE DXA 1 CIR 2))
(ARRAY* (NOTYPE (DXA NIL) (CIR ? ?)))
Also, NCOMPLR now uses its own private obarray when compiling a
file, in addition to its own private readtable; they are contained,
respectively, in the two global variables COBARRAY and CREADTABLE.
If you have the practice of escaping to top-level LISP, and
loading in some of your own functions, be sure to do this stuff
under the correct obarray and readtable. E.G., you might do
((LAMBDA (OBARRAY READTABLE)
(FASLOAD MY FUNS DSK LOSER))
COBARRAY CREADTABLE)
TUESDAY APRIL 23,1974 NM+2D.8H.36M.6S. LISP 810 - GLS -
BRIEF SYNOPSIS:
[1] NEW FUNCTION: GETCHARN
[2] ALARMCLOCK AND TTY INTERRUPTS ARE RUN WITH (NOINTERRUPT T)
[3] NEW ARRAY SCHEME
[4] NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL
[5] UUO'S CHANGED: LER2,LER4 GONE; LER3 MOVED; ACALL,AJCALL NEW
[6] HH$X SLIGHTLY IMPROVED
----------------------------------------------------------------
[1] NEW FUNCTION: GETCHARN IS LIKE GETCHAR, BUT RETURNS A
NUMBER INSTEAD OF A SINGLE CHARACTER OBJECT. IT IS
TO GETCHAR AS EXPLODEN IS TO EXPLODEC, AND IS SIMILAR IN ACTION
TO (LAMBDA (X) (CAR (EXPLODEN X))). EXAMPLES:
(GETCHARN 'FOOBAR 1) => 106 ;OCTAL
(GETCHARN 'FOOBAR 4) => 102
(GETCHARN 'FOOBAR -1) => 0
(GETCHARN 'FOOBAR 77) => 0
[2] WHEN AN ALARMCLOCK OR TTY INTERRUPT HAPPENS, THE NOINTERRUPT
FLAG IS SAVED, (NOINTERRUPT T) IS PERFORMED, THE USER'S SERVICE
FUNCTION IS EXECUTED, AND THE NOINTERRUPT FLAG IS RESTORED AFTER
EXECUTION. [THE FLAG MIGHT CONCEIVABLY BE ON IF (IOC <X>) WERE
USED TO INITIATE THE INTERRUPT - NOINTERRUPT ONLY LOCKS OUT
REAL-TIME EVENTS.] THUS, AN ALARMCLOCK HANDLER, FOR EXAMPLE,
WONT BE ABORTED BY A RANDOM ↑G BEFORE IT HAS HAD A CHANCE TO
RESTART THE CLOCK.
[3] THE NEW ARRAY SCHEME IS WORKING WELL NOW FROM THE INTERPRETER
SIDE; THE NCOMPLR WILL KNOW ABOUT IT WHEN THE NEXT VERSION
IS AVAILABLE, AND COMPLR WILL FOLLOW SUIT SHORTLY THEREAFTER.
THE LISP NEW-ARRAY SCHEME COMPRISES MANY CHANGES TO THE
ARRAY PACKAGE, MOST OF WHICH ARE EXTENSIONS; THERE
ARE FEW INCOMPATIBILITIES. THE MOST IMPORTANT EXTENSION IS
THE ADDITION OF TWO NEW TYPES OF ARRAYS: FIXNUM AND FLONUM.
THESE TYPES OF ARRAYS STORE THEIR ELEMENTS AS 36-BIT WORDS
RATHER THAN AS 18-BIT POINTERS, THUS SAVING SPACE AND TIME.
SHORTLY, BOTH COMPLR AND NCOMPLR WILL PRODUCE CODE FOR ARRAYS
THAT WILL OPEN-ACCESS BOTH STANDARD AND FULLWORD ARRAYS ALMOST
AS FAST AS FORTRAN-COMPILED CODE DOES.
ONE SOMEWHAT DRASTIC CHANGE: NSTORE WILL GO AWAY, SINCE
FIXNUM ARRAYS CAN BE USED WHERE AN ARRAY OF NUMBERS IS DESIRED.
FUNCTIONS SUCH AS LOADARRAYS AND DISGORGE WILL BE MODIFIED TO
USE FIXNUM ARRAYS RATHER THAN S-EXPRESSION-WITHOUT-GC-PROTECTION
ARRAYS. IT IS POSSIBLE THAT SOMETIME IN THE FUTURE THERE MAY BE
OTHER VERSIONS OF THE FIXNUM-ARRAY IDEA, IN WHICH THE USER
SPECIFIES THE NUMBER OF BITS FOR EACH ENTRY; THUS AN ARRAY
OF 1-BIT BYTES COULD EFFECT A SAVINGS OF A FACTOR OF 36. BUT
THIS IS ONLY A POSSIBILITY FOR THE FUTURE. OTHER CHANGES AND
EXTENSIONS ARE DESCRIBED BELOW ON A FUNCTION-BY-FUNCTION BASIS:
(*ARRAY <ARRAY> <TYPE> <DIM1> ... <DIMN>) ;LSUBR (2 . 7)
CREATES AN N-DIMENSIONAL ARRAY. <TYPE> SPECIFIES THE TYPE
OF THE ARRAY TO BE CREATED:
T S-EXPRESSION (AS BEFORE)
NIL S-EXPRESSION (BUT NO GC PROTECTION)
FIXNUM CONTAINS FIXNUMS AS 36-BIT WORDS
FLONUM CONTAINS FLONUMS AS 36-BIT WORDS
OBARRAY OBARRAY
READTABLE READTABLE
IF <ARRAY> IS NIL, THEN AN ARRAY OF THE SPECIFIED TYPE,
DIMENSIONALITY, AND SIZE IS CREATED, AND A FRESH ARRAY
POINTER IS CONSED UP AND RETURNED; THE LATTER IS AN
OBJECT WHICH POINTS TO THE BODY OF THE ARRAY.
TYPEP OF SUCH AN OBJECT RETURNS "ARRAY". SUCH OBJECTS
ARE ALSO THE RESULT OF SAYING (GET 'FOO 'ARRAY), AND
ARE THE VALUE OF ATOMIC SYMBOLS LIKE OBARRAY AND READTABLE.
ARRAY POINTERS MAY BE GIVEN TO APPLY AND FUNCALL; THUS
(READTABLE 10) IS THE 10'TH ENTRY OF THE INITIAL READTABLE,
THAT IS, OF THE ARRAY UNDER READTABLE'S ARRAY PROPERTY; BUT
(FUNCALL READTABLE 10) IS THE 10'TH ENTRY OF THE CURRENT
READTABLE, THAT IS, THE ARRAY POINTER WHICH IS THE VALUE
OF THE VARIABLE "READTABLE". IN GENERAL, ARRAY POINTERS
MAY BE USED IN ALMOST ANY PLACE (ALMOST!) THAT AN ATOMIC
SYMBOL WITH AN ARRAY PROPERTY MAY BE USED. THERE IS A PLACE
WHERE ARRAY POINTERS MUST BE USED IN PREFERENCE TO ATOMIC
SYMBOLS WITH ARRAY PROPERTIES: SEE THE NEW "ARRAYCALL"
FUNCTION BELOW. IN GENERAL, THE USER CANNOT MANIPULATE
ARRAYS DIRECTLY, BUT ONLY THROUGH ARRAY POINTERS; THIS
IS BECAUSE ARRAYS MAY BE RELOCATED WITHOUT WARNING BY
THE GARBAGE COLLECTOR. FURTHERMORE, NO TWO NON-EQ ARRAY
POINTERS CAN EVER POINT TO THE SAME ARRAY.
IF <ARRAY> IS NON-NIL, THEN IT MUST BE EITHER AN ARRAY
POINTER OR AN ATOMIC SYMBOL. IF IT IS A SYMBOL, AND THE
SYMBOL HAS NO ARRAY PROPERTY, IT IS GIVEN ONE (A FRESH
ARRAY POINTER IS CONSED UP FOR THIS PURPOSE). IF <ARRAY>
IS AN ARRAY POINTER, OR A SYMBOL WITH AN ARRAY PROPERTY,
THEN ANY ARRAY CURRENTLY POINTED TO BY THAT POINTER IS
KILLED. IN ANY CASE THE ARRAY POINTER IS THEN MADE TO
POINT TO THE NEWLY CREATED ARRAY.
AN ARRAY MAY BE UP TO FIVE-DIMENSIONAL (FORMERLY ONLY FOUR
DIMENSIONS WERE ALLOWED). IF <DIMX> IS SPECIFIED AS JX,
THEN THE X'TH SUBSCRIPT VARIES FROM 0 TO JX-1, AS BEFORE.
AN ARRAY IS EFFECTIVELY A FUNCTION; THUS IF FOO HAS AN
ARRAY PROPERTY, THEN (FOO 1 3) RETURNS ELEMENT [1,3] OF THE
ARRAY FOO (WHICH BETTER BE TWO-DIMENSIONAL!)
WHEN A NEW ARRAY IS CREATED, ITS ENTRIES ARE INITIALIZED TO
NIL FOR ARRAYS OF TYPE "T" OR "NIL", TO 0 FOR FIXNUM ARRAYS,
OR TO 0.0 FOR FLONUM ARRAYS. TO INITIALIZE AN ARRAY TO OTHER
VALUES, SEE THE FUNCTIONS *REARRAY, BLTARRAY, AND FILLARRAY
BELOW.
IF <TYPE> IS OBARRAY OR READTABLE, THEN THE EXTRA ARGUMENTS
HAVE A SLIGHTLY DIFFERENT SIGNIFICANCE. ONLY TWO OR THREE
ARGUMENTS IN ALL MAY BE GIVEN; THE THIRD, IF PRESENT, TELLS
HOW TO INITIALIZE THE OBARRAY OR READTABLE.
FOR AN OBARRAY, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW
OBARRAY SHOULD BE LEFT COMPLETELY EMPTY. A THIRD ARGUMENT
OF T MEANS THAT THE NEW ARGUMENT SHOULD BE INITIALIZED FROM
THE CURRENT OBARRAY (THAT IS, FROM WHATEVER ARRAY POINTER IS
THE CURRENT VALUE OF THE VARIABLE "OBARRAY"). ANY OTHER
THIRD ARGUMENT MUST BE AN ARRAY OF TYPE OBARRAY FROM WHICH
TO INITIALIZE THE NEW OBARRAY. OMITTING THE THIRD ARGUMENT
IS THE SAME AS SAYING T. NOTE THAT WHEN ONE OBARRAY IS
INITIALIZED FROM ANOTHER, THE BUCKETS ARE COPIED, BUT
THE ATOMIC SYMBOLS ARE NOT COPIED.
FOR A READTABLE, A THIRD ARGUMENT OF NIL MEANS THAT THE NEW
READTABLE SHOULD BE INITIALIZED FROM THE CURRENT READTABLE.
A THIRD ARGUMENT OF T MEANS TO INITIALIZE FROM THE SYSTEM'S
INITIAL READTABLE. ANY OTHER THIRD ARGUMENT MUST BE A
READTABLE TO INITIALIZE FROM. (IT MAKES NO SENSE TO HAVE AN
"EMPTY" READTABLE AS IT DOES FOR AN OBARRAY). OMITTING THE
THIRD ARGUMENT IS THE SAME AS SAYING NIL.
EXAMPLES:
(*ARRAY 'FOO 'FIXNUM 3 4 5) ;FOO GETS AN ARRAY
; PROPERTY FOR A
; 3X4X5 ARRAY OF FIXNUMS
(*ARRAY NIL T 4 4) ;RETURNS ARRAY POINTER
; FOR A 4X4 ARRAY OF
; ARBITRARY S-EXPRESSIONS
(*ARRAY 'QUUX 'READTABLE) ;QUUX IS GIVEN AN ARRAY
; PROPERTY FOR A
; READTABLE, INITIALIZED
; FROM CURRENT ONE
(ARRAY <<ARRAY> <TYPE> <DIM1> ... <DIMN>) ;FSUBR
ARRAY IS THE SAME AS *ARRAY, EXCEPT THAT THE FIRST TWO
ARGUMENTS ARE NOT EVALUATED. THUS THE EXAMPLES ABOVE COULD
HAVE BEEN WRITTEN:
(ARRAY FOO FIXNUM 3 4 5)
(ARRAY NIL T 4 4)
(ARRAY QUUX READTABLE)
(STORE <ARRAY CALL> <VALUE>) ;FSUBR
THIS WORKS AS BEFORE: IT STORES THE GIVEN VALUE IN THE
SPECIFIED ARRAY ELEMENT. IF <ARRAY CALL> IS A CALL TO
A FIXNUM OR FLONUM ARRAY, THEN <VALUE> SHOULD BE A FIXNUM
OR FLONUM, RESPECTIVELY. RECALL THAT STORE EVALUATES ITS
SECOND ARGUMENT BEFORE THE FIRST ARGUMENT; THUS
(SETQ J 3)
(STORE (FOOARRAY (SETQ J 5)) J)
WILL STORE 3, NOT 5, IN ELEMENT 5 OF FOOARRAY. ONE SHOULD AVOID
DEPENDING ON THIS FACT, HOWEVER, IN THE INTERESTS OF CLARITY.
SEE ALSO THE DESCRIPTION OF THE NEW "ARRAYCALL" FUNCTION BELOW.
(ARRAYDIMS <ARRAY>) ;SUBR 1
THIS FUNCTION WORKS AS BEFORE, BUT CAN RETURN A BROADER
RANGE OF VALUES. IT RETURNS A LIST, SUCH THAT THE CAR
OF THE LIST IS THE TYPE OF THE ARRAY (I.E., T, NIL,
FIXNUM, FLONUM, OBARRAY, OR READTABLE), AND THE CDR IS
A LIST OF ARRAY DIMENSIONS. THUS:
(ARRAY QUUX FIXNUM 3 4 5)
(ARRAYDIMS 'QUUX) => (FIXNUM 3 4 5)
(ARRAYDIMS (GET 'QUUX 'ARRAY)) => (FIXNUM 3 4 5)
(ARRAY ZORCH OBARRAY)
(ARRAYDIMS 'ZORCH) => (OBARRAY 777)
WHERE 777 HAPPENS TO BE THE SIZE OF AN OBARRAY ON THIS
GIVEN LISP SYSTEM (THIS VARIES FROM ONE LISP TO ANOTHER).
NOTE THAT ARRAYDIMS RETURNS SLIGHTLY DIFFERENT VALUES FOR
READTABLES AND OBARRAYS THAN IT USED TO.
(*REARRAY <ARRAY> <TYPE> <DIM1> ... <DIMN>) ;LSUBR (1 . 7)
THIS FUNCTION WORKS PRETTY MUCH AS BEFORE.
IF IT IS GIVEN ONLY ONE ARGUMENT (*REARRAY FOO), THEN FOO
MAY BE AN ARRAY POINTER OR AN ATOMIC SYMBOL. IF IT IS AN
ATOMIC SYMBOL WITH NO ARRAY PROPERTY, IT MERELY RETURNS.
OTHERWISE IT KILLS THE ARRAY POINTED TO BY THE ARRAY POINTER
(THE ONE GIVEN, OR THE ONE OBTAINED FROM THE SYMBOL'S
PROPERTY LIST). THE ARRAY POINTER IS NOW "DEAD", AND CANNOT
BE USED AS A FUNCTION UNLESS AND UNTIL IT IS GIVEN A NEW
ARRAY TO POINT TO.
IF MORE THAN ONE ARGUMENT IS GIVEN TO *REARRAY, THEN THEY
SHOULD BE ARGUMENTS SIMILAR TO THOSE FOR *ARRAY, EXCEPT THAT
THE FIRST ARGUMENT MUST ALREADY BE A LIVE ARRAY, EITHER AS
AN ARRAY POINTER OR AS A SYMBOL WITH A LIVE ARRAY PROPERTY.
*REARRAY EFFECTIVELY CREATES A NEW ARRAY OF THE SPECIFIED
DIMENSIONS AND BLTARRAY'S DATA FROM THE GIVEN ARRAY INTO THE
NEW, THEN ALTERS THE ARRAY POINTER TO POINT TO THE NEW ARRAY.
*REARRAY WILL NOT PERMIT YOU TO ALTER THE TYPE OF THE ARRAY
AT PRESENT - YOU MUST SPECIFY THE CORRECT TYPE. IT IS RATHER
MEANINGLESS TO USE *REARRAY OF MORE THAN ONE ARGUMENT ON A
READTABLE OR OBARRAY.
(BLTARRAY <FROMARRAY> <TOARRAY>) ;SUBR 2
BLTARRAY, AS BEFORE, COPIES THE DATA IN <FROMARRAY> INTO
<TOARRAY>. IF <FROMARRAY> IS SHORTER, THEN EXTRA DATA IN
<TOARRAY> IS UNHARMED, MORE OR LESS. IF <TOARRAY> IS
SHORTER, THEN AS MUCH DATA AS WILL FIT IS COPIED.
BLTARRAY INSISTS ON GETTING TWO ARRAYS OF THE SAME TYPE;
IT WILL NOT COPY A FIXNUM ARRAY INTO A FLONUM ARRAY, AN
S-EXPRESSION ARRAY, OR A READTABLE.
IF ONE OBARRAY IS COPIED INTO ANOTHER, THE BUCKETS ARE
COPIED AS WELL, AS IF FOR *ARRAY.
(LISTARRAY <ARRAY>) ;SUBR 1
LISTARRAY NOW WORKS ON ARRAYS OF ALL TYPES AND ALL
DIMENSIONS. IT RETURNS A LIST OF ALL THE DATA IN THE
GIVEN ARRAY. IF A MULTI-DIMENSIONAL ARRAY IS GIVEN,
THE DATA IS TAKEN IN ROW-MAJOR ORDER; FOR EXAMPLE:
(ARRAY FOO FIXNUM 2 2)
(LISTARRAY 'FOO)
RETURNS FOO[0,0] FOO[0,1] FOO[1,0] FOO[1,1] AS A LIST
IN THAT ORDER.
(FILLARRAY <ARRAY> <LIST>) ;SUBR 2
FILLARRAY IS AN INVERSE TO LISTARRAY, EXCEPT THAT IT
IS NOT PERMITTED TO USE FILLARRAY ON READTABLES OR
OBARRAYS. IT DISTRIBUTES THE GIVEN LIST OF ITEMS
INTO THE GIVEN ARRAY IN ROW-MAJOR ORDER. IF A FIXNUM
OR FLONUM ARRAY IS SUPPLIED, THEN THE ELEMENTS OF THE
LIST MUST ALL BE FIXNUMS OR FLONUMS, RESPECTIVELY.
IF THERE ARE TOO MANY ITEMS IN THE LIST, THE EXTRA ONES
ARE IGNORED; IF THERE ARE NOT ENOUGH, THEN THE LAST ONE
IS USED TO FILL OUT THE ARRAY. THUS
(FILLARRAY 'FOO '(43 11 27)) ;RANDOM NUMBERS
FILLS FOO, AS DEFINED ABOVE, SUCH THAT
FOO[0,0] = 43
FOO[0,1] = 11
FOO[1,0] = 27
FOO[1,1] = 27
(MAKOBLIST <ARG>) ;SUBR 1
THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING
EQUIVALENCES IN THE NEW ARRAY SCHEME:
(MAKOBLIST NIL) <=> (LISTARRAY OBARRAY)
(MAKOBLIST X) <=> (*ARRAY X 'OBARRAY)
FOR X NOT NIL.
(MAKREADTABLE <ARG>) ;SUBR 1
THIS FUNCTION WORKS AS BEFORE. NOTE THE FOLLOWING
EQUIVALENCES IN THE NEW ARRAY SCHEME:
(MAKREADTABLE NIL) <=> (*ARRAY (GENSYM) 'READTABLE)
(MAKREADTABLE T) <=> (*ARRAY (GENSYM) 'READTABLE T)
(MAKREADTABLE X) <=> (*ARRAY X 'READTABLE)
FOR X NOT NIL OR T.
(ARRAYCALL <TYPE> <APTR> <ARG1> ... <ARGN>) ;LSUBR (2 . 6)
[SEE ALSO ITEM [4] BELOW.]
ARRAYCALL IS SIMILAR TO FUNCALL, BUT INSISTS THAT ITS SECOND
ARGUMENT BE AN ARRAY POINTER (AN ATOMIC SYMBOL WITH AN ARRAY
PROPERTY IS NOT ACCEPTABLE IN THIS CONTEXT!) ITS FIRST ARGUMENT
SHOULD MATCH THE TYPE INFORMATION OF THE ARRAY - EITHER FIXNUM,
FLONUM, NIL, OR T.
ITS PRIME VIRTUE IS THAT IT PERMITS THE COMPILER TO OPEN-CODE
ACCESS TO VARIABLE ARRAYS. ONE MAY ALSO WRITE
(STORE (ARRAYCALL TYPE VAR X1 ... XN) VAL)
AND HAVE IT COMPILE EFFICIENTLY. EXAMPLE OF USE:
(DEFUN TRANSPOSE (A)
(PROG (ARY TYP)
(COND ((EQ (SETQ TYP (TYPEP A)) 'ARRAY)
(SETQ ARY A))
((AND (EQ TYP 'SYMBOL)
(SETQ ARY (GET A 'ARRAY))))
(T (RETURN
(TRANSPOSE
(ERROR 'NON-ARRAY/ -/ TRANSPOSE
A 'WRNG-TYPE-ARG)))))
(OR (AND (= (LENGTH (SETQ TYP
(ARRAYDIMS ARY)))
3)
(= (CADR TYP) (CADDR TYP)))
(RETURN
(TRANSPOSE
(ERROR 'NOT/ 2-DIM/ SQUARE/ -/ TRANSPOSE
A 'WRNG-TYPE-ARG))))
(DO ((N) (I 1 (1+ I)))
((= I (CADR TYP)))
(DO ((J 1 (1+ J)))
((= J I))
(SETQ N (ARRAYCALL (CAR TYP) ARY I J))
(STORE (ARRAYCALL (CAR TYP) ARY I J)
(ARRAYCALL (CAR TYP) ARY J I))
(STORE (ARRAYCALL (CAR TYP) ARY J I) N)))
(RETURN A)))
ANOTHER VARIATION WOULD BE TO LIMIT TRANSPOSE TO FIXNUM ARRAYS.
THE EACH OF THE FOUR USAGES OF ARRAYCALL WOULD BE LIKE
(ARRAYCALL 'FIXNUM ARY . . .), AND THE NCOMPLR WOULD BE ABLE
TO MAKE OPEN-CODED REFERENCES TO THE ARRAY.
PRIN1, PRINC, EXPLODEC, ETC.
THE PRINT FUNCTIONS AND OTHER RELATED FUNCTIONS PRINT ARRAY
POINTERS IN THE FOLLOWING MANNER: IF THE ARRAY POINTER IS
DEAD (POINTS TO NO LIVE ARRAY), IT PRINTS AS "#DEAD-ARRAY".
OTHERWISE IT PRINTS AS "#", THE TYPE OF ARRAY, "-", THE
DIMENSIONS OF THE ARRAY SEPARATED BY ":" IN THE CURRENT
RADIX, "-", AND THE ADDRESS OF THE ARRAY POINTER IN OCTAL.
THUS PRINTING AN ARRAY POINTER LETS YOU SEE THE SAME
INFORMATION RETURNED BY ARRAYDIMS. EXAMPLES:
USER: (ARRAY NIL OBARRAY)
LISP: #OBARRAY-777-103426
U: (ARRAY NIL FIXNUM 4 5 6)
L: #FIXNUM-4:5:6-103424
U: (ARRAY FOO T 3 5 2 4 3)
L: FOO
U: (GET 'FOO 'ARRAY)
L: #T-3:5:2:4:3-102362
[4] THREE NEW FUNCTIONS: SUBRCALL, LSUBRCALL, ARRAYCALL.
(ARRAYCALL IS ALSO THORUGHLY DESCRIBED IN ITEM [3].)
THESE ARE ANALOGOUS TO FUNCALL, IN THAT THEY TAKE
A "FUNCTION" SPECIFICATION AS THE FIRST ARGUMENT AND
AND ARGUMENTS FOR THAT FUNCTION AS THE REST OF THE
ARGUMENTS. THE DIFFERENCE IS THAT THE SECOND ARGUMENT
TO <FOO>CALL (FOR <FOO> AMONG [SUBR, LSUBR, ARRAY])
SHOULD BE THE KIND OF ITEM YOU WOULD OBTAIN BY SAYING
(GET 'QUUX '<FOO>) FOR SOME ATOMIC SYMBOL QUUX.
THUS:
(SUBRCALL NIL (GET 'CAR 'SUBR) '(A . B)) => A
YOU USE THESE AT YOUR OWN RISK, OF COURSE; THE INTERPRETER
CAN'T CHECK EVERYTHING. SOON THE COMPILER WILL OPEN-CODE
THESE GUYS SUPER-EFFICIENTLY.
HERE IS AN INTERESTING HACK:
(SETQ SUBRDISPATCH (ARRAY NIL T 40)) ;40=RANDOM SIZE
(DO ((I 0 (1+ I))
(X '(CAR CDR CADR REVERSE EXPLODE ...) (CDR X)))
((NULL X))
(STORE (ARRAYCALL T SUBRDISPATCH I)
(GET (CAR X) 'SUBR)))
(SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 3) '(A B C)) => (C B A)
(SUBRCALL NIL (ARRAYCALL T SUBRDISPATCH 1) '(A B C)) => B
AND SO FORTH AND SO ON. THAT IS, YOU CAN HAVE AN ARRAY
OF DISPATCH ADDRESSES. AGAIN, BE CAREFUL!
[5] FOR MACHINE LANGUAGE HACKERS ONLY:
PDP-10 LISP'S UUO'S HAVE BEEN REARRANGED. LER2 AND LER4
HAVE BEEN FLUSHED. LER3'S OPCODE HAS BEEN ALTERED.
TWO NEW UUO'S: ACALL AND AJCALL. THE EFFECTIVE ADDRESS
OF ACALL MUST AN ARRAY POINTER, WHICH SHOULD HAVE ITS
COMPILED-CODE-NEEDS-ME BIT TURNED ON. ACALL SERVES
AS AN NCALL TO AN ARRAY (ONE CAN'T INCREMENT THE
EFFECTIVE ADDRESS OF AN NCALL TO AN ARRAY BECAUSE IT
IS INDIRECT). THE UUO HANDLER THUS SMASHES NCALL'S TO
ARRAYS TO BE ACALL'S INSTEAD OF PUSHJ'S, AND SIMILARLY
NJCALL'S TO BE AJCALL'S. IN MOST PRACTICAL CASES THIS
WILL NOT BE NECESSARY, SINCE THE COMPILER HOPEFULLY
CAN OPEN-CODE MOST ARRAY ACCESSES ANYWAY.
THE GETMIDASOP FUNCTION HAS BEEN UPDATED TO REFLECT
THESE ALTERED OP-CODES.
[6] HH$X TRIES NOT TO SIGNAL A ↑H INTERRUPT IF IT THINKS THAT THE
INTERRUPT WILL BE STACKED IN THE INTERRUPT QUEUE RATHER THAN
RUN IMMEDIATELY. IT WILL SIMPLY RETURN TO DDT IN THIS CASE.
FRIDAY MARCH 01,1974 FQ+18H.38M.31S. LISP 767 - GLS -
[1] NEGATIVE RUNTIMES
[2] ERRFRAME CHANGE
[3] FUNCALL PUSHES APPLY FRAMES
[4] NEW FUNCTION: NRECONC
[5] PRINT, PRIN1, PRINC CHECK I/O FLAGS - AFFECTS ABBREVIATION
[6] (STATUS UREAD) IS NOW CONSISTENT ABOUT LINKS
[7] SOME CHANGES TO ARRAY STUFF (PREPARING FOR NEW ARRAYS)
[7A] TYPEP MAY RETURN ARRAY
[7B] BIBOP SAR SPACE NOW CALLED ARRAY SPACE
[7C] IN BOTH LISPS, ALLOC SAYS "ARRAY="
[8] REVIEW OF P.$X AND FRIENDS
----------------------------------------------------------------
[1] IT HAS BEEN OBSERVED THAT OCCASIONALLY RUNTIMES WILL BE
MEASURED AS BEING NEGATIVE. THIS IS APPARENTLY AN ITS BUG
HAVING SOMETHING TO DO WITH REQUESTING CORE MANAGEMENT,
SO IT HAPPENS MORE IN BIBOP LISP THAN IN NON-BIBOP. I'VE
TAKEN SOME COMPENSATIVE ACTIONS, BUT BE FOREWARNED AND BEWARE.
[2] CHANGE TO ERRFRAMES: FOR COMPATIBILITY WITH EVALFRAMES,
ERRFRAMES ARE NOW OF THE FORM
(ERR <PDL POINTER> <ERROR MESSAGE> <A-LIST>)
I.E. THE ATOM "ERR" IS NOW CONSED ON THE FRONT, JUST
AS "EVAL" OR "APPLY" IS CONSED ONTO AN EVALFRAME.
[3] SPEAKING OF EVALFRAMES: FUNCALL CREATES SUCH A FRAME
OF THE APPLY VARIETY THESE DAYS.
[4] (NRECONC X Y) <=> (NCONC (NREVERSE X) Y)
BUT IS FASTER, BECAUSE IT DOESN'T HAVE TO SCAN BACK
DOWN THE LIST JUST NREVERSED TO DO THE NCONC.
[5] PRINT, PRIN1, AND PRINC CHECK ALL THEOUTPUT FLAGS
(↑W, ↑R, ↑B, ↑N) BEFORE COMMENCING PRINTOUT.
IF THE FLAGS ALL INDICATE NO OUTPUT, THEY RETURN
IMMEDIATELY, THUS SAVING MUCH TIME.
FURTHERMORE, IF OUTPUT IS GOING TO THE TTY AND
NOWHERE ELSE, AND YOU ARE USING PRINLEVEL AND PRINLENGTH
TO GET ABBREVIATED FORMS OUTPUT, THEN ONLY THE
ABBREVIATED FORMS ARE GENERATED. THIS MEANS THAT
TYPING ↑R IN THE MIDDLE OF SUCH A PRINTOUT MAY
CAUSE A FILE TO RECEIVE (THE TAIL END OF) AN
ABBREVIATED FORM, EVEN IF (STATUS ABBREVIATE)
REQUESTS OTHERWISE. ON THE OTHER HAND, THIS HACK
PREVENTS CERTAIN SCREWS INVOLVING CIRCULAR LISTS.
[6] IF DSK:LOSER;FOO BAR IS A LINK TO DSK:CLOD;ZORCH QUUX
AND YOU DO (UREAD FOO BAR DSK LOSER), THEN (STATUS UREAD)
WILL RETURN (ZORCH QUUX DSK CLOD) AND NOT
(ZORCH QUUX DSK LOSER) AS IT USED TO.
[7] SOME NEW STUFF HAS BEEN INSTALLED IN THIS LISP
IN ANTICIPATION OF THE NEW FAST ARRAY SCHEME.
A NEW KIND OF SPACE HAS BEEN IMPLEMENTED IN
NON-BIBOP LISP, ANALOGOUS TO BIBOP LISP'S
FORMER "SAR" SPACE, WHICH HOLDS OBJECTS CALLED
ARRAY POINTERS.
[7A] SUCH OBJECTS ARE OF TYPE "ARRAY". TYPEP
WILL RETURN "ARRAY" FOR SUCH AN OBJECT.
[7B] BIBOP'S SAR SPACE IS NOW CALLED ARRAY SPACE,
FOR INDEED THEY ARE THE SAME OBJECTS.
THUS YOU MUST NOW SAY (ALLOC '(ARRAY 300))
INSTEAD OF (ALLOC '(SAR 300)), ETC.
[7C] THE INITIAL ALLOC WILL ASK YOU "ARRAY=".
ARRAY POINTERS ARE TWO WORDS, SO IF YOU SAY
100., YOU HAVE ALLOCATED ROOM FOR 50. ARRAY
POINTERS.
OTHERWISE ALL THE ARRAY STUFF SHOULD WORK THE SAME AS
BEFORE; BUT WATCH FOR THE NEW ARRAY SCHEME!
[8] FOR PEOPLE WHO USE DDT TO DEBUG LISP CODE (I.E.
SUPER-HACKERS), HERE IS A REVIEW OF P.$X AND FRIENDS:
P.$X AND RELATED GOODIES ARE NAMED INSTRUCTIONS WHICH
YOU CAN EXECUTE FROM DDT WITH THE $X COMMAND WHICH DO
ALL KINDS OF NICE THINGS FOR YOU. THEY AVOID CLOBBERING
ANYTHING WITHIN THE LISP, E.G. THEY SAVE AND RESTORE
ANY ACCUMULATORS AND/OR TEMPORARIES THEY USE,
AND ARE CIRCUMSPECT ABOUT I/O SWITCHES.
REFERENCES TO "THE LEFT HALF OF ." OR "THE RIGHT HALF
OF ." MEANS THAT THE LEFT OR RIGHT HALF OF DDT'S
CURRENTLY OPEN LOCATION IS UNDER CONSIDERATION. $=ALTMODE.
P.$X ASSUMES THE RIGHT HALF OF . TO BE AN
S-EXPRESION, AND PRINTS IT.
PL.$X PRINTS THE LEFT HALF OF . AS AN S-EXPRESSION.
PP Z$X WHERE Z IS SOME QUANTITY, PRINTS THAT QUANTITY
AS IF IT WERE A POINTER, AS AN S-EXPRESSION.
(PP IS A UUO, AND Z IS ITS EFFECTIVE ADDRESS.
SINCE PP IS A UUO, A FEW TEMPORARIES USED BY THE
UUO HANDLER GET CLOBBERED; THUS BEWARE OF USING
IT IF YOU MAY HAVE BROKEN OUT OF THE UUO
HANDLER TO DDT.)
VC.$X ASSUMES THAT THE RIGHT HALF OF . POINTS TO
A VALUE CELL, AND RUNS OVER THE OBARRAY TRYING
TO FIND AN ATOM WITH THAT VALUE CELL. PRINTS
THE ATOM IF IT FINDS ONE, OTHERWISE PRINTS ?.
VCL.$X ASSUMES LEFT HALF OF . POINTS TO A VALUE CELL,
AND BEHAVES LIKE VC.$X. NOTE THAT THIS IS
PARTICULARLY GOOD FOR EXAMINING SPECIAL PDL
ENTRIES, WHICH HAVE VALUE CELL POINTERS IN THE
LEFT HALF, AND OLD VALUES ON THE RIGHT HALF.
SB.$X ASSUMES THAT THE RIGHT HALF OF . POINTS
SOMEWHERE INTO THE MIDDLE OF A SUBR, AND RUNS
OVER THE OBARRAY TRYING TO FIND THE NAME OF THE
SUBR. IF THE NAME CAN BE FOUND, IT IS PRINTED.
THIS IS ESPECIALLY GOOD FOR REGULAR PDL ENTRIES
CREATED BY PUSHJ, BECAUSE THEY CONTAIN A SUBR
RETURN ADDRESS IN THE RIGHT HALF.
HH$X CREATE A FAKE ↑H BREAKPOINT IN LISP.
THIS SAVES THE ENVIRONMENT THE WAY ANY USER
INTERRUPT DOES AND LETS YOU INVESTIGATE A
LITTLE. THIS IS GOOD WHEN YOU CAN'T AFFORD
TO PROCEED THE LISP EVEN LONG ENOUGH TO TYPE
↑H AT IT. WHEN YOU TYPE $P AT LISP, YOU WILL
SEE A *. YOU ARE IN DDT! (YES, $P GETS YOU BACK
TO DDT, NOT BACK FROM IT, HERE!)
NOTE THAT IF YOU WENT BACK TO DDT WHILE LISP
HAD USER INTERRUPTS LOCKED OUT (E.G. IN THE
MIDDLE OF A GARBAGE COLLECTION), THEN THE
↑H BREAK CAN'T BE RUN; YOU WILL RETURN TO DDT
IMMEDIATELY.
DP$X DEPURIFIES THE PAGE CONTAINING .. THIS WAS
INVENTED BEFORE DDT DID IT FOR YOU.
RP$X REPURIFIES THE PAGE CONTAINING .. THIS IS
SOMEWHAT MORE USEFUL, E.G. TO REPURIFY A PAGE
AFTER PATCHING IT.
PURIFY$G THIS PURIFIES THE SYSTEM PAGES OF LISP
WHICH MAY BE PURE. FOR BIBOP LISP, IT ALSO
PURIFIES THOSE PAGES OF USER CODE WHICH HAVE
BEEN MARKED AS PURIFIABLE. IT TENDS TO
DESTROY ACCUMULATORS; YOU CAN'T PROCEED AFTER
DOING IT. (IT IS GENERALLY PERFORMED PRIOR
TO DUMPING OUT A LISP, E.G. JUST AFTER A
CALL TO THE FUNCTION MACDMP.)
THE REST OF THESE ARE AVAILABLE ONLY IN BIBOP LISP.
T.$X IS LIKE P.$X, BUT INSTEAD OF PRINTING THE
RIGHT HALF OF . AS AN S-EXPRESSION, IT GETS
TYPEP INFORMATION FOR IT FROM THE BIBOP
TYPE TABLE, AND PRINTS THE TYPE INFORMATION.
TL.$X LIKE T.$X, BUT LOOKS AT THE LEFT HALF OF ..
TP Z$X LIKE PP Z$X, ONLY DOES T. INSTEAD OF P..
TBLPUR$X PRINTS OUT BIBOP'S PURTBL DATA BASE,
ONE DIGIT FOR EVERY PAGE IN THE 256K ADDRESS
SPACE. THE DIGITS ARE 0 = NONEXISTENT MEMORY,
1 = IMPURE MEMORY, 2 = PURE MEMORY,
3 = MEMORY IN AN UNCERTAIN STATE, E.G. PDL
AREAS AND THE END OF BINARY PROGRAM SPACE.
AT THE END SUMMARIES ARE PRINTED.
THIS IS NOT THE ACTUAL STATE OF MEMORY, BUT
ONLY WHAT BIBOP WOULD LIKE IT TO BE,
E.G. A PAGE MARKED 2 MAY NOT REALLY BE PURE.
PURIFY$X IN BIBOP EFFECTIVELY FORCES THE ACTUAL
STATE OF THE WORLD TO CONFORM TO THE PURTBL.
PAGPUR$X PRINTS OUT A TABLE LIKE TBLPUR, BUT
DISPLAYS THE ACTUAL STATE OF EACH PAGE,
NONEXISTENT, IMPURE, OR PURE.